Skip to content

feat(a2a-gateway): add runtime streaming-ingress dispatch wrapper - #441

Merged
yordis merged 3 commits into
mainfrom
yordis/feat-a2a-gateway-runtime-streaming-pump
Jun 29, 2026
Merged

feat(a2a-gateway): add runtime streaming-ingress dispatch wrapper#441
yordis merged 3 commits into
mainfrom
yordis/feat-a2a-gateway-runtime-streaming-pump

Conversation

@yordis

@yordis yordis commented Jun 29, 2026

Copy link
Copy Markdown
Member
  • Encodes "is this a streaming method?" exactly once at the dispatch boundary so the orchestrator can fan out to the streaming pump without re-parsing wire shapes at every call site.
  • Splits the wire-parsing classifier out from the NATS-bound spawner so the typed `StreamingIngressKind` decision (and the `task_id` / `last_seq` resume cursor extraction) stays unit-testable without standing up a real broker.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
@cursor

cursor Bot commented Jun 29, 2026

Copy link
Copy Markdown

PR Summary

Medium Risk
New ingress routing for long-lived streaming pumps affects request handling and NATS subject binding; behavior is guarded by strict fallthrough on bad ids/req ids and covered by unit tests, but orchestrator wiring is not in this diff.

Overview
Adds runtime/streaming, a dispatch-boundary wrapper that decides once whether an ingress request is message.stream or tasks.resubscribe and either spawns the existing streaming pump or returns NotStreaming so unary handling can continue.

classify_streaming_spawn is pure and testable: it requires a correlatable req_id, maps the two streaming method-dot strings to StreamingIngressKind, and for resubscribe parses task_id (id / task_id / taskId) plus optional last_seq (default 0 when omitted for spawn). Missing req_id, unknown methods, or invalid/missing task ids intentionally fall through instead of spawning a pump.

maybe_spawn_streaming_ingress_pump (behind cfg(not(coverage))) bridges classification to spawn_streaming_ingress_pump with caller gate/config and exposes MaybeStreamingSpawn::Spawned(Result<…>) vs NotStreaming. Unit tests cover param parsing and classification branches.

Reviewed by Cursor Bugbot for commit 2e399cc. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@yordis, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 54 minutes

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable usage-based reviews in Billing to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please see our Fair Usage Limits Policy for further information, and refer to the rate limits docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 79a0b534-a2c6-47db-ae08-ec72f6c52378

📥 Commits

Reviewing files that changed from the base of the PR and between f0779e0 and 2e399cc.

📒 Files selected for processing (1)
  • rsworkspace/crates/a2a-gateway/src/runtime/streaming.rs

Walkthrough

Adds a new runtime::streaming submodule to the a2a-gateway crate. The module defines MaybeStreamingSpawn and StreamingSpawnIntent enums, method-dots constants, a classify_streaming_spawn function, JSON-RPC param helpers (task_id_from_resubscribe_params, last_seq_from_resubscribe_params), and a maybe_spawn_streaming_ingress_pump orchestrator, along with unit tests.

Changes

Streaming Ingress Dispatch

Layer / File(s) Summary
Enums, constants, and module wiring
rsworkspace/crates/a2a-gateway/src/runtime.rs, rsworkspace/crates/a2a-gateway/src/runtime/streaming.rs
Declares pub mod streaming in runtime.rs, defines MaybeStreamingSpawn and StreamingSpawnIntent enums, and adds MESSAGE_STREAM_METHOD_DOTS / TASKS_RESUBSCRIBE_METHOD_DOTS constants.
classify_streaming_spawn and param helpers
rsworkspace/crates/a2a-gateway/src/runtime/streaming.rs
Implements classify_streaming_spawn routing method dots to spawn intents via req-id presence check, plus task_id_from_resubscribe_params and last_seq_from_resubscribe_params extracting typed fields from JSON-RPC params.
maybe_spawn_streaming_ingress_pump
rsworkspace/crates/a2a-gateway/src/runtime/streaming.rs
Implements the #[cfg(not(coverage))] orchestrator that calls classify_streaming_spawn and either falls through as NotStreaming or constructs a StreamingIngressSpawn and calls spawn_streaming_ingress_pump.
Unit tests
rsworkspace/crates/a2a-gateway/src/runtime/streaming/tests.rs
Tests task_id_from_resubscribe_params across all key spellings and invalid inputs, last_seq_from_resubscribe_params across spellings and absent/non-integer values, and classify_streaming_spawn for all branches including NotStreaming fallbacks and default last_seq = 0.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • TrogonStack/trogonai#300: Adds the JSON-RPC codec and extract_request_id used by classify_streaming_spawn to determine req-id presence.
  • TrogonStack/trogonai#357: Adds the server-side message.stream handler whose method constant matches MESSAGE_STREAM_METHOD_DOTS classified here.
  • TrogonStack/trogonai#414: Introduces StreamingIngressKind, StreamingIngressSpawn, and spawn_streaming_ingress_pump that maybe_spawn_streaming_ingress_pump directly wraps.

Suggested labels

rust:coverage-baseline-reset

🐇 A streaming pump awakes from its slumber,
Classifying dots and tasks without blunder.
message.stream or resubscribe — it knows!
Req-id found? Then off the spawn goes.
With last_seq defaulted to zero, hooray,
This rabbit's ingress dispatch is ready today! 🎉

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: adding a runtime streaming-ingress dispatch wrapper.
Description check ✅ Passed The description is directly related to the changeset and explains the dispatch wrapper and testable parsing split.
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 unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch yordis/feat-a2a-gateway-runtime-streaming-pump

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.

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

Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c3ef9ed. Configure here.

params
.get("last_seq")
.or_else(|| params.get("lastSeq"))
.and_then(Value::as_u64)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Resubscribe resume cursor incomplete

Medium Severity

classify_streaming_spawn derives tasks.resubscribe resume position via last_seq_from_resubscribe_params, which only reads last_seq and lastSeq. It ignores lastSequence, last_sequence, and metadata.lastEventId / metadata.last_event_id that parse_resubscribe_params already supports, so those clients resume at sequence zero and replay the full task event stream.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit c3ef9ed. Configure here.

.get("last_seq")
.or_else(|| params.get("lastSeq"))
.and_then(Value::as_u64)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Duplicated resubscribe param parsing

Medium Severity

New task_id_from_resubscribe_params and last_seq_from_resubscribe_params reimplement a subset of the crate’s existing parse_resubscribe_params in gw_ingress_stream.rs, which already centralizes task id validation and cursor alias handling for the same wire shape.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit c3ef9ed. Configure here.

@github-actions

github-actions Bot commented Jun 29, 2026

Copy link
Copy Markdown

badge

Code Coverage Summary

Details
Filename                                                                                  Stmts    Miss  Cover    Missing
--------------------------------------------------------------------------------------  -------  ------  -------  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
crates/a2a-redaction/src/signed_bundle/signature.rs                                          30       3  90.00%   37-39
crates/a2a-redaction/src/signed_bundle/public_key.rs                                         36       2  94.44%   44-45
crates/a2a-redaction/src/signed_bundle/digest.rs                                             26       0  100.00%
crates/a2a-redaction/src/signed_bundle/manifest.rs                                           56       1  98.21%   83
crates/a2a-redaction/src/signed_bundle/verify.rs                                             64       2  96.88%   90-91
crates/a2a-gateway/src/jwt_caller_identity.rs                                               151       4  97.35%   165-169, 182-186
crates/a2a-gateway/src/gw_ingress_stream.rs                                                 144       4  97.22%   319-321, 536
crates/a2a-gateway/src/audit_ingress.rs                                                     110       0  100.00%
crates/a2a-gateway/src/main.rs                                                                1       0  100.00%
crates/a2a-gateway/src/aauth.rs                                                             199       5  97.49%   253-256, 277
crates/a2a-gateway/src/config.rs                                                             57       0  100.00%
crates/a2a-gateway/src/gw_pull_backpressure.rs                                              209       3  98.56%   504, 704, 717
crates/a2a-gateway/src/lib.rs                                                                 3       0  100.00%
crates/a2a-gateway/src/agent_card_surface.rs                                                  3       0  100.00%
crates/a2a-gateway/src/push_dlq_mirror.rs                                                   133      16  87.97%   162-166, 218, 223-226, 236, 261, 382-389
crates/a2a-gateway/src/runtime.rs                                                             4       0  100.00%
crates/a2a-nats/src/nats/subjects/tasks/events.rs                                            17       0  100.00%
crates/ard-nats/src/catalog_event.rs                                                         71       0  100.00%
crates/ard-nats/src/memory_catalog_store.rs                                                  32       0  100.00%
crates/ard-nats/src/catalog_index.rs                                                         82       2  97.56%   37, 104
crates/ard-nats/src/store.rs                                                                  3       0  100.00%
crates/ard-nats/src/catalog_subject.rs                                                       14       3  78.57%   19-21
crates/acp-nats/src/agent/new_session.rs                                                      5       0  100.00%
crates/acp-nats/src/agent/set_session_model.rs                                               16       0  100.00%
crates/acp-nats/src/agent/logout.rs                                                           5       0  100.00%
crates/acp-nats/src/agent/cancel.rs                                                          12       0  100.00%
crates/acp-nats/src/agent/ext_method.rs                                                      12       0  100.00%
crates/acp-nats/src/agent/set_session_config_option.rs                                       16       0  100.00%
crates/acp-nats/src/agent/fork_session.rs                                                    16       0  100.00%
crates/acp-nats/src/agent/js_request.rs                                                      73       6  91.78%   84-89
crates/acp-nats/src/agent/set_session_mode.rs                                                16       0  100.00%
crates/acp-nats/src/agent/close_session.rs                                                   16       0  100.00%
crates/acp-nats/src/agent/resume_session.rs                                                  16       0  100.00%
crates/acp-nats/src/agent/ext_notification.rs                                                12       0  100.00%
crates/acp-nats/src/agent/initialize.rs                                                       6       0  100.00%
crates/acp-nats/src/agent/load_session.rs                                                    16       0  100.00%
crates/acp-nats/src/agent/prompt.rs                                                         156       7  95.51%   201-207
crates/acp-nats/src/agent/rpc_call.rs                                                        23       0  100.00%
crates/acp-nats/src/agent/test_support.rs                                                   194       0  100.00%
crates/acp-nats/src/agent/bridge.rs                                                         124       4  96.77%   108-111
crates/acp-nats/src/agent/authenticate.rs                                                     5       0  100.00%
crates/acp-nats/src/agent/list_sessions.rs                                                    5       0  100.00%
crates/trogonai-proto/src/scheduler/schedules/codec.rs                                       57       0  100.00%
crates/mcp-nats/src/nats/subjects/subscriptions/all_client.rs                                 6       0  100.00%
crates/mcp-nats/src/nats/subjects/subscriptions/all_server.rs                                 6       0  100.00%
crates/mcp-nats/src/nats/subjects/subscriptions/one_client.rs                                 9       0  100.00%
crates/mcp-nats/src/nats/subjects/subscriptions/one_server.rs                                 9       0  100.00%
crates/a2a-nats/src/agent_id.rs                                                              21       0  100.00%
crates/a2a-nats/src/jsonrpc.rs                                                               27       0  100.00%
crates/a2a-nats/src/req_id.rs                                                                21       0  100.00%
crates/a2a-nats/src/config.rs                                                               114       0  100.00%
crates/a2a-nats/src/task_id.rs                                                               22       0  100.00%
crates/a2a-nats/src/context_id.rs                                                            22       0  100.00%
crates/a2a-nats/src/wire.rs                                                                  59       2  96.61%   85, 98
crates/a2a-nats/src/a2a_prefix.rs                                                            16       0  100.00%
crates/a2a-nats/src/gateway_ingress.rs                                                      146      21  85.62%   165-168, 172, 186, 194-200, 233, 238-244
crates/a2a-nats/src/server/message_stream.rs                                                 56       6  89.29%   155-157, 165-167
crates/a2a-nats/src/server/agent_card.rs                                                     16       0  100.00%
crates/a2a-nats/src/server/tasks_resubscribe.rs                                              12       0  100.00%
crates/a2a-nats/src/server/dispatch.rs                                                       33       0  100.00%
crates/a2a-nats/src/server/tasks_cancel.rs                                                   12       0  100.00%
crates/a2a-nats/src/server/tasks_get.rs                                                      12       0  100.00%
crates/a2a-nats/src/server/tasks_list.rs                                                     12       0  100.00%
crates/a2a-nats/src/server/test_support.rs                                                   81      25  69.14%   134-159
crates/a2a-nats/src/server/push_get.rs                                                       12       0  100.00%
crates/a2a-nats/src/server/push_delete.rs                                                    12       0  100.00%
crates/a2a-nats/src/server/bridge.rs                                                         65       0  100.00%
crates/a2a-nats/src/server/wire.rs                                                           34       4  88.24%   21-23, 30
crates/a2a-nats/src/server/push_set.rs                                                       12       0  100.00%
crates/a2a-nats/src/server/push_list.rs                                                      12       0  100.00%
crates/a2a-nats/src/server/message_send.rs                                                   15       0  100.00%
crates/a2a-nats/src/server/handler.rs                                                        39       0  100.00%
crates/a2a-gateway/src/runtime/tier1_denial.rs                                               34       1  97.06%   60
crates/a2a-gateway/src/runtime/env.rs                                                        55       0  100.00%
crates/a2a-gateway/src/runtime/audit_publish.rs                                              16       0  100.00%
crates/a2a-gateway/src/runtime/streaming.rs                                                  35       0  100.00%
crates/a2a-gateway/src/runtime/tier1.rs                                                      30       0  100.00%
crates/a2a-gateway/src/runtime/reply.rs                                                       5       0  100.00%
crates/trogon-gateway/src/source/incidentio/incidentio_event_type.rs                         20       0  100.00%
crates/trogon-gateway/src/source/incidentio/incidentio_signing_secret.rs                     22       0  100.00%
crates/trogon-gateway/src/source/incidentio/server.rs                                        72       0  100.00%
crates/trogon-gateway/src/source/incidentio/signature.rs                                      8       0  100.00%
crates/trogon-std/src/env/system.rs                                                          12       0  100.00%
crates/trogon-std/src/env/in_memory.rs                                                       30       0  100.00%
crates/trogon-std/src/env/enumerate_env.rs                                                    6       0  100.00%
crates/trogon-std/src/env/read_env.rs                                                         3       0  100.00%
crates/a2a-nats/src/catalog/import_gate/spicedb/cache.rs                                     36       0  100.00%
crates/a2a-nats/src/catalog/import_gate/spicedb/config.rs                                    70       0  100.00%
crates/a2a-nats/src/catalog/import_gate/spicedb/mod.rs                                      108       0  100.00%
crates/a2a-nats/src/catalog/import_gate/spicedb/client.rs                                    29      15  48.28%   43-69, 97-99, 108-117
crates/trogon-gateway/src/source/github/config.rs                                             9       0  100.00%
crates/trogon-gateway/src/source/github/server.rs                                            50       0  100.00%
crates/trogon-gateway/src/source/github/signature.rs                                          9       0  100.00%
crates/trogon-gateway/src/source/discord/gateway.rs                                         116       1  99.14%   137
crates/trogon-gateway/src/source/discord/config.rs                                           45       0  100.00%
crates/trogon-scheduler/src/queries/read_model/message.rs                                    77       0  100.00%
crates/trogon-scheduler/src/queries/read_model/schedule.rs                                   15       0  100.00%
crates/trogon-nats/src/lease/ttl.rs                                                          27       0  100.00%
crates/trogon-nats/src/lease/release.rs                                                       5       5  0.00%    8-12
crates/trogon-nats/src/lease/nats_kv_lease_config.rs                                         26       0  100.00%
crates/trogon-nats/src/lease/acquire.rs                                                       5       5  0.00%    9-14
crates/trogon-nats/src/lease/lease_timing.rs                                                 15       0  100.00%
crates/trogon-nats/src/lease/lease_bucket.rs                                                 19       0  100.00%
crates/trogon-nats/src/lease/mod.rs                                                         107      13  87.85%   113-126
crates/trogon-nats/src/lease/provision.rs                                                    83      10  87.95%   82-92
crates/trogon-nats/src/lease/renew.rs                                                        82      19  76.83%   23-29, 48-59
crates/trogon-nats/src/lease/renew_interval.rs                                               25       0  100.00%
crates/trogon-nats/src/lease/lease_key.rs                                                    19       0  100.00%
crates/acp-nats/src/nats/subjects/responses/ext_ready.rs                                     12       0  100.00%
crates/acp-nats/src/nats/subjects/responses/response.rs                                      20       0  100.00%
crates/acp-nats/src/nats/subjects/responses/update.rs                                        20       0  100.00%
crates/acp-nats/src/nats/subjects/responses/cancelled.rs                                     15       0  100.00%
crates/acp-nats/src/nats/subjects/responses/prompt_response.rs                               20       0  100.00%
crates/trogon-decider-runtime/src/snapshot/read_snapshot.rs                                   3       0  100.00%
crates/trogon-decider-runtime/src/snapshot/snapshot_type.rs                                  42       0  100.00%
crates/trogon-decider-runtime/src/snapshot/mod.rs                                             3       0  100.00%
crates/ard-registry/src/source_url.rs                                                        26       1  96.15%   30
crates/ard-registry/src/http_error.rs                                                        17       0  100.00%
crates/ard-registry/src/extract.rs                                                           12       0  100.00%
crates/ard-registry/src/router.rs                                                            33       0  100.00%
crates/ard-registry/src/registry_config.rs                                                   16       0  100.00%
crates/ard-registry/src/explore_request.rs                                                   30       0  100.00%
crates/ard-registry/src/search_filters.rs                                                    28       0  100.00%
crates/ard-registry/src/facet_field.rs                                                       13       0  100.00%
crates/ard-registry/src/page_token.rs                                                        14       0  100.00%
crates/ard-registry/src/filters.rs                                                           31       0  100.00%
crates/ard-registry/src/lexical_rank.rs                                                      55       2  96.36%   15, 64
crates/ard-registry/src/list_agents_request.rs                                               21       0  100.00%
crates/ard-registry/src/registry.rs                                                         134       3  97.76%   78, 174, 183
crates/ard-registry/src/search_request.rs                                                    32       1  96.88%   43
crates/trogonai-proto/src/codec.rs                                                           16       0  100.00%
crates/trogonai-proto/src/convert.rs                                                         53       0  100.00%
crates/a2a-nats-http/src/handlers/mod.rs                                                    185      12  93.51%   68, 88-91, 121, 155, 169-172, 185
crates/trogon-gateway/src/source/gitlab/signature.rs                                         13       0  100.00%
crates/trogon-gateway/src/source/gitlab/gitlab_signing_token.rs                              30       0  100.00%
crates/trogon-gateway/src/source/gitlab/server.rs                                            78       0  100.00%
crates/trogon-scheduler/src/commands/resume_schedule.rs                                      34       0  100.00%
crates/trogon-scheduler/src/commands/state.rs                                                78       0  100.00%
crates/trogon-scheduler/src/commands/create_schedule.rs                                      32       0  100.00%
crates/trogon-scheduler/src/commands/record_schedule_occurrence.rs                          113       1  99.12%   182
crates/trogon-scheduler/src/commands/schedule_next_occurrence.rs                             74       0  100.00%
crates/trogon-scheduler/src/commands/remove_schedule.rs                                      30       0  100.00%
crates/trogon-scheduler/src/commands/pause_schedule.rs                                       31       0  100.00%
crates/trogon-std/src/duration.rs                                                            15       0  100.00%
crates/trogon-std/src/http.rs                                                                 8       0  100.00%
crates/trogon-std/src/args.rs                                                                12       9  25.00%   11-28
crates/trogon-std/src/json.rs                                                                23       0  100.00%
crates/trogon-std/src/secret_string.rs                                                       13       0  100.00%
crates/trogon-std/src/signal.rs                                                              22      12  45.45%   6-11, 18-25, 34
crates/trogon-std/src/uuid.rs                                                                 3       0  100.00%
crates/acp-nats/src/nats/mod.rs                                                              61      13  78.69%   22-33, 75
crates/acp-nats/src/nats/jsonrpc.rs                                                          51      11  78.43%   46, 54-55, 57-63, 81-83
crates/acp-nats/src/nats/parsing.rs                                                         113      15  86.73%   138-152, 192
crates/acp-nats/src/nats/extensions.rs                                                        3       0  100.00%
crates/trogon-std/src/telemetry/http.rs                                                      58       0  100.00%
crates/a2a-nats/src/push/push_payload.rs                                                     18       0  100.00%
crates/a2a-nats/src/push/dlq_dedup.rs                                                        51       1  98.04%   79
crates/a2a-nats/src/push/push_delivery_semantics_registry.rs                                 17       0  100.00%
crates/a2a-nats/src/push/status_transition_id.rs                                             15       0  100.00%
crates/a2a-nats/src/push/terminal_push_task_state.rs                                         17       0  100.00%
crates/a2a-nats/src/push/caller_id.rs                                                        41       0  100.00%
crates/a2a-nats/src/push/delivery_semantics.rs                                               98       0  100.00%
crates/a2a-nats/src/push/push_notification_target.rs                                         32       0  100.00%
crates/a2a-nats/src/push/idempotency_key_header.rs                                           16       0  100.00%
crates/a2a-nats/src/push/push_notification_config.rs                                          6       0  100.00%
crates/a2a-nats/src/push/target.rs                                                           19       0  100.00%
crates/a2a-nats/src/push/dlq.rs                                                              56       0  100.00%
crates/a2a-nats/src/push/authentication_header.rs                                            31       0  100.00%
crates/a2a-nats/src/push/push_notification_config_id.rs                                      17       0  100.00%
crates/a2a-nats/src/push/push_idempotency_key.rs                                             43       0  100.00%
crates/a2a-nats/src/push/dispatch_error.rs                                                   24       0  100.00%
crates/a2a-nats/src/push/nats_push_subject.rs                                                12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/call_tool.rs                                        12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/list_resources.rs                                   12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/read_resource.rs                                    12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/complete.rs                                         12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/get_prompt.rs                                       12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/initialize.rs                                       12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/ping.rs                                              9       0  100.00%
crates/mcp-nats/src/nats/subjects/server/resource_list_changed.rs                            12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/resource_updated.rs                                 12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/progress.rs                                         12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/logging_message.rs                                  12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/set_logging_level.rs                                12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/cancelled.rs                                        12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/list_prompts.rs                                     12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/unsubscribe_resource.rs                             12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/list_resource_templates.rs                          12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/elicitation_completed.rs                            12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/list_tools.rs                                       12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/cancel_task.rs                                      12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/get_task.rs                                         12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/list_tasks.rs                                       12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/subscribe_resource.rs                               12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/tool_list_changed.rs                                12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/get_task_result.rs                                  12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/prompt_list_changed.rs                              12       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/tasks/list.rs                                       15       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/tasks/get.rs                                        15       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/tasks/cancel.rs                                     15       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/tasks/resubscribe.rs                                15       0  100.00%
crates/a2a-identity-types/src/principal.rs                                                   16       0  100.00%
crates/a2a-identity-types/src/jwt.rs                                                         71       0  100.00%
crates/a2a-identity-types/src/caller.rs                                                      24       0  100.00%
crates/ard-catalog/src/catalog_entry.rs                                                     107       0  100.00%
crates/ard-catalog/src/catalog_host_wire.rs                                                   6       0  100.00%
crates/ard-catalog/src/catalog_manifest.rs                                                   44       0  100.00%
crates/ard-catalog/src/url_or_data.rs                                                        20       0  100.00%
crates/ard-catalog/src/catalog_entry_wire.rs                                                  3       0  100.00%
crates/ard-catalog/src/display_name.rs                                                       13       0  100.00%
crates/ard-catalog/src/registry_error_wire.rs                                                 8       0  100.00%
crates/ard-catalog/src/ard_identifier.rs                                                     54       0  100.00%
crates/ard-catalog/src/federation_mode.rs                                                     3       0  100.00%
crates/ard-catalog/src/media_type.rs                                                         20       0  100.00%
crates/ard-catalog/src/catalog_host.rs                                                       26       0  100.00%
crates/ard-catalog/src/trust_manifest.rs                                                     45       1  97.78%   35
crates/ard-catalog/src/ard_storage_key.rs                                                    10       0  100.00%
crates/ard-catalog/src/metadata.rs                                                           14       0  100.00%
crates/ard-catalog/src/representative_queries.rs                                             18       0  100.00%
crates/ard-catalog/src/catalog_manifest_wire.rs                                               3       0  100.00%
crates/ard-catalog/src/catalog_manifest_schema.rs                                            65       4  93.85%   109-110, 112-113
crates/trogon-scheduler/src/commands/domain/schedule_occurrence_sequence.rs                  16       0  100.00%
crates/trogon-scheduler/src/commands/domain/schedule_event_delivery.rs                       14       0  100.00%
crates/trogon-scheduler/src/commands/domain/schedule.rs                                     373       0  100.00%
crates/trogon-scheduler/src/commands/domain/schedule_event_status.rs                          6       0  100.00%
crates/trogon-scheduler/src/commands/domain/schedule_event_schedule.rs                       35       0  100.00%
crates/trogon-scheduler/src/commands/domain/schedule_id.rs                                   37       0  100.00%
crates/trogon-scheduler/src/commands/domain/schedule_event_sampling_source.rs                11       0  100.00%
crates/trogon-scheduler/src/commands/domain/message.rs                                      139       0  100.00%
crates/trogon-scheduler/src/commands/domain/recurrence.rs                                    78       1  98.72%   99
crates/mcp-nats/src/nats/subjects/client/initialized.rs                                      12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/roots_list_changed.rs                               12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/cancelled.rs                                        12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/ping.rs                                              9       0  100.00%
crates/mcp-nats/src/nats/subjects/client/list_roots.rs                                       12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/create_message.rs                                   12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/progress.rs                                         12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/create_elicitation.rs                               12       0  100.00%
crates/trogon-gateway/src/source/notion/signature.rs                                          9       0  100.00%
crates/trogon-gateway/src/source/notion/notion_event_type.rs                                 20       0  100.00%
crates/trogon-gateway/src/source/notion/notion_verification_token.rs                          9       0  100.00%
crates/trogon-gateway/src/source/notion/server.rs                                           120       4  96.67%   116-117, 136-137
crates/trogon-gateway/src/source/notion/verification_token.rs                                46       0  100.00%
crates/mcp-nats-server/src/main.rs                                                            1       1  0.00%    67
crates/mcp-nats-server/src/runtime.rs                                                       266      90  66.17%   146-164, 200-202, 220-221, 232, 265-269, 273-282, 304-317, 322-357, 383-394
crates/mcp-nats-server/src/allowed_host.rs                                                   52       0  100.00%
crates/mcp-nats-server/src/config.rs                                                         58       0  100.00%
crates/a2a-bridge/src/main.rs                                                                 1       1  0.00%    199
crates/a2a-bridge/src/auth.rs                                                                47      15  68.09%   78-99, 148
crates/a2a-bridge/src/outbound.rs                                                            70       7  90.00%   126, 197-209
crates/a2a-bridge/src/nats_transport_harness.rs                                              42       0  100.00%
crates/a2a-bridge/src/inbound.rs                                                            326      91  72.09%   115-119, 142-144, 191-231, 292-417, 469-471, 482, 580, 631-646, 687-692
crates/a2a-bridge/src/identity.rs                                                            63       0  100.00%
crates/trogon-decider-runtime/src/event/stream_event.rs                                       8       0  100.00%
crates/trogon-decider-runtime/src/event/event_identity.rs                                     3       0  100.00%
crates/trogon-decider-runtime/src/event/event_id.rs                                          32       0  100.00%
crates/trogon-scheduler/src/telemetry/trace.rs                                               20       0  100.00%
crates/trogon-scheduler/src/telemetry/metrics.rs                                             27       0  100.00%
crates/a2a-gateway/src/policy/tier2/mod.rs                                                   46       0  100.00%
crates/a2a-gateway/src/policy/tier2/rule_name.rs                                             19       0  100.00%
crates/trogon-std/src/time/mock.rs                                                           32       0  100.00%
crates/trogon-std/src/time/system.rs                                                          9       0  100.00%
crates/acp-nats/src/telemetry/metrics.rs                                                     22       0  100.00%
crates/a2a-pack/src/agent_card_schema.rs                                                     40       0  100.00%
crates/a2a-pack/src/resource_tuples.rs                                                      152       0  100.00%
crates/a2a-pack/src/agent_card_read.rs                                                       23       0  100.00%
crates/a2a-nats/src/audit/envelope.rs                                                        57       0  100.00%
crates/a2a-nats/src/audit/task_lifecycle.rs                                                  17       0  100.00%
crates/a2a-nats/src/audit/emitter.rs                                                         58       0  100.00%
crates/trogon-identity-types/src/act_chain.rs                                                13       0  100.00%
crates/jsonrpc-nats/src/transport.rs                                                         92       1  98.91%   106
crates/jsonrpc-nats/src/message.rs                                                           11       3  72.73%   37-39
crates/jsonrpc-nats/src/id.rs                                                                62      20  67.74%   44-61, 81-82, 84-85, 91-92, 98-99, 112
crates/acp-nats/src/client/ext_session_prompt_response.rs                                    22       0  100.00%
crates/acp-nats/src/client/fs_write_text_file.rs                                             43       0  100.00%
crates/acp-nats/src/client/request_permission.rs                                             40       0  100.00%
crates/acp-nats/src/client/session_update.rs                                                  2       0  100.00%
crates/acp-nats/src/client/terminal_kill.rs                                                  41       0  100.00%
crates/acp-nats/src/client/terminal_output.rs                                                29       0  100.00%
crates/acp-nats/src/client/terminal_release.rs                                               35       0  100.00%
crates/acp-nats/src/client/terminal_wait_for_exit.rs                                         55       0  100.00%
crates/acp-nats/src/client/test_support.rs                                                   17       0  100.00%
crates/acp-nats/src/client/rpc_reply.rs                                                     107      43  59.81%   45-47, 61-63, 80-120
crates/acp-nats/src/client/terminal_create.rs                                                41       0  100.00%
crates/acp-nats/src/client/fs_read_text_file.rs                                              27       0  100.00%
crates/acp-nats/src/client/mod.rs                                                           101       1  99.01%   56
crates/acp-nats/src/client/ext.rs                                                            57       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/prompt_wildcard.rs                            9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_agent_ext.rs                              9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/global_all.rs                                 9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_agent.rs                                 15       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_client.rs                                15       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_session.rs                                9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_session.rs                               12       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_agent.rs                                  9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_client.rs                                 9       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/push/delete.rs                                      15       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/push/set.rs                                         12       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/push/get.rs                                         12       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/push/list.rs                                        15       0  100.00%
crates/trogon-decider-runtime/src/event/codec/event_payload_error.rs                          5       0  100.00%
crates/trogon-decider-runtime/src/event/codec/event_decode.rs                                13       0  100.00%
crates/trogon-decider/src/act.rs                                                             62       0  100.00%
crates/trogon-decider/src/decision.rs                                                        27       0  100.00%
crates/trogon-decider/src/events.rs                                                          49       0  100.00%
crates/trogon-decider/src/testing.rs                                                        274       0  100.00%
crates/a2a-auth-callout/src/credentials/mtls.rs                                             153      13  91.50%   71-72, 168-169, 209-213, 216-219
crates/a2a-auth-callout/src/credentials/api_key.rs                                           46       1  97.83%   33
crates/a2a-auth-callout/src/credentials/oidc.rs                                             188       4  97.87%   212-215
crates/a2a-nats/src/nats/subjects/agents/message_stream.rs                                   15       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/card.rs                                             12       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/message_send.rs                                     15       0  100.00%
crates/mcp-nats/src/telemetry/transport.rs                                                    6       0  100.00%
crates/trogon-gateway/src/source/telegram/registration.rs                                    82       0  100.00%
crates/trogon-gateway/src/source/telegram/signature.rs                                        7       0  100.00%
crates/trogon-gateway/src/source/telegram/server.rs                                          53       0  100.00%
crates/trogon-gateway/src/source/telegram/config.rs                                          42       0  100.00%
crates/a2a-nats/src/nats/subjects/subscriptions/task_all_events.rs                            9       0  100.00%
crates/a2a-nats/src/nats/subjects/subscriptions/agent_all.rs                                 12       0  100.00%
crates/a2a-nats/src/nats/subjects/subscriptions/task_one_events.rs                           12       0  100.00%
crates/a2a-gateway/src/policy/tier2_cel/evaluator.rs                                        138       0  100.00%
crates/a2a-gateway/src/policy/tier2_cel/bundle.rs                                           120      26  78.33%   70-72, 74-76, 86, 92, 111-113, 123-127, 158, 162-164, 166-168, 171, 178, 181
crates/a2a-gateway/src/policy/tier2_cel/compiler.rs                                          25       3  88.00%   61-63
crates/a2a-nats/src/client/wire.rs                                                           13       0  100.00%
crates/a2a-nats/src/client/streaming.rs                                                      73       0  100.00%
crates/a2a-nats/src/client/resubscribe.rs                                                    28       0  100.00%
crates/a2a-nats/src/client/gateway_headers.rs                                                19       0  100.00%
crates/a2a-nats/src/client/unary.rs                                                          39       1  97.44%   57
crates/a2a-nats/src/client/event_stream.rs                                                   76       0  100.00%
crates/a2a-nats/src/client/handle.rs                                                        218       0  100.00%
crates/a2a-nats/src/client/error.rs                                                          14       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_release.rs                             12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_kill.rs                                12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/session_update.rs                               12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_output.rs                              12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_create.rs                              12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_wait_for_exit.rs                       12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/session_request_permission.rs                   12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_write_text_file.rs                           12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_read_text_file.rs                            12       0  100.00%
crates/trogon-nats/src/mocks.rs                                                             224       0  100.00%
crates/trogon-nats/src/token.rs                                                               6       0  100.00%
crates/trogon-nats/src/connect.rs                                                            26       6  76.92%   42-47
crates/trogon-nats/src/messaging.rs                                                         168       2  98.81%   146, 156
crates/trogon-nats/src/server_info.rs                                                        21       3  85.71%   19-21
crates/trogon-nats/src/auth.rs                                                               45       0  100.00%
crates/trogon-nats/src/nats_token.rs                                                         56       0  100.00%
crates/trogon-nats/src/client.rs                                                             22      22  0.00%    50-86
crates/trogon-identity-types/src/aauth/mod.rs                                                60       4  93.33%   107-109, 154
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_encode_error.rs                    16       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_envelope_decode_error.rs            6       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_envelope_encode_error.rs            3       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/encoded_snapshot.rs                         44       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_decode_error.rs                    19       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_payload_decode.rs                   3       0  100.00%
crates/a2a-auth-callout/src/signing_key_source/env.rs                                        40       0  100.00%
crates/a2a-auth-callout/src/signing_key_source/vault.rs                                       3       0  100.00%
crates/a2a-auth-callout/src/signing_key_source/signing_key_handle.rs                         15       0  100.00%
crates/a2a-auth-callout/src/signing_key_source/static_source.rs                              25       0  100.00%
crates/a2a-auth-callout/src/signing_key_source/file.rs                                       38       6  84.21%   40-42, 61-63
crates/a2a-auth-callout/src/signing_key_source/key_version.rs                                16       0  100.00%
crates/a2a-auth-callout/src/signing_key_source/loader.rs                                     23       0  100.00%
crates/a2a-auth-callout/src/signing_key_source/minting_material.rs                           18       0  100.00%
crates/a2a-nats/src/catalog/registrar.rs                                                     56       0  100.00%
crates/a2a-nats/src/catalog/nats_kv.rs                                                        8       0  100.00%
crates/a2a-nats/src/catalog/watch.rs                                                         18       0  100.00%
crates/a2a-nats/src/catalog/spicedb_permission.rs                                           178      17  90.45%   151-156, 175, 340-344, 373-374, 385-387, 394-396
crates/a2a-nats/src/catalog/agent_view.rs                                                    47       0  100.00%
crates/a2a-nats/src/catalog/store.rs                                                        117       0  100.00%
crates/ard-registry/src/bin/ard-registry-demo/main.rs                                        64      20  68.75%   13-35
crates/acp-nats-agent/src/connection.rs                                                     468       1  99.79%   704
crates/trogon-nats/src/telemetry/messaging.rs                                                37       0  100.00%
crates/trogon-aauth-verify/src/time_source.rs                                                10       0  100.00%
crates/trogon-aauth-verify/src/nats_pop.rs                                                  125       2  98.40%   269, 332
crates/trogon-aauth-verify/src/jwks.rs                                                       15       0  100.00%
crates/trogon-aauth-verify/src/token.rs                                                     148       1  99.32%   100
crates/trogon-aauth-verify/src/replay.rs                                                     26       0  100.00%
crates/trogon-aauth-verify/src/jkt.rs                                                        33       0  100.00%
crates/trogon-aauth-verify/src/challenge.rs                                                  45       0  100.00%
crates/trogon-aauth-verify/src/jwks_cache.rs                                                 39       0  100.00%
crates/trogon-aauth-verify/src/test_support.rs                                               86       0  100.00%
crates/trogon-gateway/src/source/microsoft_graph/server.rs                                   73       0  100.00%
crates/trogon-gateway/src/source/microsoft_graph/client_state.rs                             14       0  100.00%
crates/a2a-auth-callout/src/main.rs                                                           1       1  0.00%    226
crates/a2a-auth-callout/src/denial_category.rs                                               29       0  100.00%
crates/a2a-auth-callout/src/permissions.rs                                                   85       0  100.00%
crates/a2a-auth-callout/src/error.rs                                                          3       0  100.00%
crates/a2a-auth-callout/src/subscriber.rs                                                    96      96  0.00%    27-178
crates/a2a-auth-callout/src/dispatcher.rs                                                    34      13  61.76%   83-112
crates/a2a-auth-callout/src/denial_reason.rs                                                 15       0  100.00%
crates/a2a-auth-callout/src/caller_jwt_header.rs                                             20       0  100.00%
crates/a2a-auth-callout/src/test_support.rs                                                  20      20  0.00%    16-36
crates/a2a-auth-callout/src/denial_claims.rs                                                 68       0  100.00%
crates/a2a-auth-callout/src/account_resolver.rs                                              31       0  100.00%
crates/acp-nats/src/nats/subjects/global/ext_notify.rs                                        9       0  100.00%
crates/acp-nats/src/nats/subjects/global/ext.rs                                               9       0  100.00%
crates/acp-nats/src/nats/subjects/global/initialize.rs                                        6       0  100.00%
crates/acp-nats/src/nats/subjects/global/session_list.rs                                      6       0  100.00%
crates/acp-nats/src/nats/subjects/global/session_new.rs                                       6       0  100.00%
crates/acp-nats/src/nats/subjects/global/logout.rs                                            6       0  100.00%
crates/acp-nats/src/nats/subjects/global/authenticate.rs                                      6       0  100.00%
crates/a2a-nats/src/push/dispatcher/http.rs                                                  19       0  100.00%
crates/a2a-nats/src/push/dispatcher/jetstream.rs                                             45       0  100.00%
crates/a2a-nats/src/push/dispatcher/composite.rs                                             15       0  100.00%
crates/a2a-nats/src/push/dispatcher/nats.rs                                                  37       0  100.00%
crates/a2a-nats/src/push/dispatcher/mod.rs                                                   16       0  100.00%
crates/trogon-gateway/src/source/linear/config.rs                                             9       0  100.00%
crates/trogon-gateway/src/source/linear/signature.rs                                          8       1  87.50%   16
crates/trogon-gateway/src/source/linear/server.rs                                            83       0  100.00%
crates/trogon-scheduler/src/processor/execution/wakeup.rs                                    91       1  98.90%   127
crates/a2a-auth-callout/src/wire/wire_codec.rs                                               58       0  100.00%
crates/a2a-auth-callout/src/wire/server_auth_request_claims.rs                              100       4  96.00%   24-26, 127
crates/a2a-auth-callout/src/wire/nkey_public.rs                                              83       3  96.39%   102, 118-119
crates/a2a-auth-callout/src/wire/xkey_public.rs                                              23       0  100.00%
crates/a2a-auth-callout/src/wire/bridge_adapter.rs                                           73       0  100.00%
crates/a2a-auth-callout/src/wire/nkey_seed.rs                                                20       0  100.00%
crates/a2a-auth-callout/src/wire/test_encode.rs                                              59       0  100.00%
crates/a2a-auth-callout/src/wire/server_auth_request_envelope.rs                             68       1  98.53%   64
crates/a2a-auth-callout/src/wire/callout_auth_response_claims.rs                             54       3  94.44%   70-72
crates/mcp-nats-stdio/src/config.rs                                                          26       0  100.00%
crates/mcp-nats-stdio/src/main.rs                                                            36       0  100.00%
crates/jsonrpc-nats/src/codec/encode.rs                                                      31       0  100.00%
crates/jsonrpc-nats/src/codec/reconstruct.rs                                                 90       5  94.44%   56-59, 91
crates/jsonrpc-nats/src/codec/decode.rs                                                      57       0  100.00%
crates/trogon-gateway/src/source/twitter/config.rs                                            9       0  100.00%
crates/trogon-gateway/src/source/twitter/server.rs                                          144       0  100.00%
crates/trogon-gateway/src/source/twitter/signature.rs                                        16       0  100.00%
crates/trogon-scheduler/src/nats.rs                                                          11       0  100.00%
crates/trogon-scheduler/src/error.rs                                                         83      12  85.54%   131-133, 152-154, 159-161, 176-180
crates/trogon-scheduler/src/config.rs                                                        27       0  100.00%
crates/trogon-scheduler/src/mocks.rs                                                        401      51  87.28%   79, 119-122, 271, 288-291, 333-335, 349-353, 362, 406-410, 462-463, 467, 485-489, 506-509, 552-572
crates/trogon-scheduler/src/processor/execution/checkpoints/record.rs                         6       0  100.00%
crates/trogon-scheduler/src/processor/execution/checkpoints/codec.rs                        318      17  94.65%   340-341, 361-362, 373-377, 405-406, 412-413, 442-443, 480, 485-487
crates/trogon-scheduler/src/processor/execution/checkpoints/store.rs                        145      16  88.97%   103, 121, 125, 132, 224-230, 279-283
crates/trogon-scheduler/src/processor/execution/checkpoints/failure.rs                       27       0  100.00%
crates/a2a-gateway/src/policy/tier1_declarative/bundle.rs                                    57       0  100.00%
crates/a2a-gateway/src/policy/tier1_declarative/loader.rs                                    85       9  89.41%   95-97, 99-101, 126-128
crates/a2a-gateway/src/policy/tier1_declarative/evaluator.rs                                158      13  91.77%   24-26, 147, 196-198, 268-272, 295
crates/a2a-gateway/src/policy/tier1_declarative/time_predicate.rs                           118       2  98.31%   103, 125
crates/mcp-nats/src/wire.rs                                                                  18       0  100.00%
crates/mcp-nats/src/jsonrpc.rs                                                                5       0  100.00%
crates/mcp-nats/src/server.rs                                                                12       0  100.00%
crates/mcp-nats/src/config.rs                                                                59       0  100.00%
crates/mcp-nats/src/mcp_peer_id.rs                                                           15       0  100.00%
crates/mcp-nats/src/mcp_prefix.rs                                                            15       0  100.00%
crates/mcp-nats/src/transport.rs                                                            263      10  96.20%   244, 256-258, 376-379, 388-389
crates/mcp-nats/src/client.rs                                                                12       0  100.00%
crates/trogon-decider-runtime/src/stream/append_stream.rs                                     5       0  100.00%
crates/trogon-decider-runtime/src/stream/read_stream.rs                                       7       0  100.00%
crates/trogon-decider-runtime/src/stream/stream_position.rs                                  26       0  100.00%
crates/trogon-scheduler/src/queries/get.rs                                                    3       0  100.00%
crates/trogon-scheduler/src/queries/schedule_id.rs                                           28       0  100.00%
crates/trogon-scheduler/src/queries/decode.rs                                                95       0  100.00%
crates/trogon-decider-nats/src/snapshot_store.rs                                            446      27  93.95%   208-210, 248-250, 361-367, 449, 585, 590, 686-688, 694-696, 730-731, 741-742, 761, 789-790
crates/trogon-decider-nats/src/store.rs                                                      73      45  38.36%   50-54, 101-167
crates/trogon-decider-nats/src/stream_store.rs                                              267      18  93.26%   70-72, 245, 273-274, 277, 293-297, 464-465, 506, 519-523
crates/acp-nats-stdio/src/config.rs                                                          15       0  100.00%
crates/acp-nats-stdio/src/main.rs                                                            58      11  81.03%   67, 110-117, 123-125, 142
crates/a2a-nats-stdio/src/wire.rs                                                            22       0  100.00%
crates/a2a-nats-stdio/src/main.rs                                                             1       0  100.00%
crates/a2a-nats-stdio/src/dispatch.rs                                                       207       8  96.14%   116, 119-121, 229, 232-234
crates/a2a-nats-stdio/src/io_loop.rs                                                         49       0  100.00%
crates/a2a-nats-stdio/src/runtime.rs                                                         21       0  100.00%
crates/trogon-scheduler/src/processor/execution/reconciliation/schedule_subject.rs           31       0  100.00%
crates/trogon-scheduler/src/processor/execution/reconciliation/rrule_wakeup_payload.rs       35       0  100.00%
crates/trogon-scheduler/src/processor/execution/reconciliation/schedule_key.rs               27       0  100.00%
crates/trogon-scheduler/src/processor/execution/reconciliation/request.rs                   230       2  99.13%   285, 290
crates/trogon-scheduler/src/processor/execution/reconciliation/recorded_events.rs           241      12  95.02%   200-205, 242, 250, 271, 291, 297, 303, 336, 346, 364, 448
crates/trogon-scheduler/src/processor/execution/reconciliation/go_duration.rs                40       0  100.00%
crates/trogon-scheduler/src/processor/execution/reconciliation/reconcile.rs                 303      13  95.71%   251-260, 325-327
crates/trogon-service-config/src/lib.rs                                                      38       0  100.00%
crates/a2a-nats/src/catalog/import_gate/principal.rs                                          9       0  100.00%
crates/a2a-nats/src/catalog/import_gate/allow_all.rs                                          2       0  100.00%
crates/a2a-nats/src/nats/subjects/stream.rs                                                  50       0  100.00%
crates/acp-nats/src/nats/subjects/commands/load.rs                                           15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/fork.rs                                           15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/cancel.rs                                         15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/prompt.rs                                         15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_config_option.rs                              15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/resume.rs                                         15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/close.rs                                          15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_mode.rs                                       15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_model.rs                                      15       0  100.00%
crates/a2a-redaction/src/bin/sign-bundle.rs                                                   1       1  0.00%    163
crates/trogon-gateway/src/source_integration_id.rs                                           28       2  92.86%   58, 60
crates/trogon-gateway/src/config.rs                                                        1087      42  96.14%   80, 665, 668, 831, 889, 975, 978, 981, 986, 1072-1079, 1157, 1160, 1163, 1168, 1227, 1230, 1233, 1313, 1316, 1319, 1324, 1389, 1392, 1395, 1464, 1467, 1470, 1475, 1551, 1554, 1557, 1567, 1626, 1629, 1632, 1847-1849
crates/trogon-gateway/src/http.rs                                                            13       0  100.00%
crates/trogon-gateway/src/source_plugin.rs                                                  268       3  98.88%   82, 139-140
crates/trogon-gateway/src/main.rs                                                            26       0  100.00%
crates/trogon-gateway/src/source_status.rs                                                   12       0  100.00%
crates/trogon-gateway/src/streams.rs                                                          7       0  100.00%
crates/a2a-gateway/src/policy/spicedb_tier1.rs                                              157      13  91.72%   226-228, 381, 448, 450-458
crates/a2a-gateway/src/policy/wasmtime_substrate.rs                                          31       0  100.00%
crates/a2a-gateway/src/policy/error.rs                                                       16       0  100.00%
crates/a2a-gateway/src/policy/per_skill.rs                                                   87       0  100.00%
crates/a2a-redaction/src/wasm/mod.rs                                                        110       9  91.82%   132-134, 147-149, 162-164
crates/a2a-redaction/src/wasm/engine.rs                                                      62      11  82.26%   46-48, 80-81, 93-95, 99-101
crates/acp-nats/src/jetstream/streams.rs                                                     18       0  100.00%
crates/acp-nats/src/jetstream/provision.rs                                                   13       0  100.00%
crates/acp-nats/src/jetstream/ext_policy.rs                                                   3       0  100.00%
crates/acp-nats/src/jetstream/consumers.rs                                                   41       0  100.00%
crates/acp-nats/src/nats/subjects/stream.rs                                                  56       0  100.00%
crates/trogon-decider-runtime/src/headers/header_value.rs                                    34       0  100.00%
crates/trogon-decider-runtime/src/headers/header_map.rs                                      54       0  100.00%
crates/trogon-decider-runtime/src/headers/header_name.rs                                     28       0  100.00%
crates/trogon-scheduler/src/processor/execution/execution_schedules/mod.rs                   82       0  100.00%
crates/a2a-auth-callout/src/jwt/nats_permission_claims.rs                                    10       0  100.00%
crates/a2a-auth-callout/src/jwt/user_jwt_subject.rs                                          12       0  100.00%
crates/a2a-auth-callout/src/jwt/nats_user_jwt.rs                                            187       1  99.47%   131
crates/a2a-auth-callout/src/jwt/mod.rs                                                      232       0  100.00%
crates/mcp-nats/src/nats/parsing.rs                                                          98       0  100.00%
crates/mcp-nats/src/nats/mod.rs                                                              23       0  100.00%
crates/trogon-nats/src/jetstream/create_conflicts.rs                                         14       0  100.00%
crates/trogon-nats/src/jetstream/publish.rs                                                  30       0  100.00%
crates/trogon-nats/src/jetstream/stream_max_age.rs                                            8       0  100.00%
crates/trogon-nats/src/jetstream/traits.rs                                                   46      40  13.04%   181-251
crates/trogon-nats/src/jetstream/claim_check.rs                                             104       3  97.12%   46-48
crates/trogon-nats/src/jetstream/mocks.rs                                                   941       1  99.89%   507
crates/acp-nats-server/src/acp_connection_id.rs                                              14       0  100.00%
crates/acp-nats-server/src/main.rs                                                           68       1  98.53%   109
crates/acp-nats-server/src/connection.rs                                                    114      35  69.30%   90-97, 102-117, 133, 135-136, 141, 150-151, 156, 160, 164, 167, 175, 179, 182, 185-189
crates/acp-nats-server/src/config.rs                                                         39       0  100.00%
crates/acp-nats-server/src/transport.rs                                                    1020     107  89.51%   242, 290-292, 527, 545, 572, 626, 631, 651, 670, 713-726, 815, 838-840, 892, 909-912, 1008-1011, 1086, 1089, 1092, 1101, 1105, 1108, 1111-1114, 1132, 1165-1168, 1176-1181, 1193-1197, 1201-1210, 1222-1223, 1241-1242, 1252, 1268-1272, 1300-1306, 1326-1328, 1333-1337, 1340-1345, 1362, 1364-1365, 1447-1448, 1460-1461, 1481-1482
crates/trogon-scheduler/src/projections/schedules/storage.rs                                  3       0  100.00%
crates/trogon-scheduler/src/projections/schedules/mod.rs                                    175       3  98.29%   703-705
crates/trogon-scheduler/src/projections/schedules/twin.rs                                    53       0  100.00%
crates/a2a-gateway/src/policy/tier3_redaction/context.rs                                     40       0  100.00%
crates/a2a-gateway/src/policy/tier3_redaction/json_path.rs                                   84       5  94.05%   37, 49, 85, 104, 115
crates/a2a-gateway/src/policy/tier3_redaction/decision.rs                                    22       0  100.00%
crates/a2a-gateway/src/policy/tier3_redaction/manifest.rs                                    69       3  95.65%   112, 121, 132
crates/a2a-gateway/src/policy/tier3_redaction/mod.rs                                         33       2  93.94%   54, 58
crates/a2a-gateway/src/policy/tier3_redaction/real_gate.rs                                  135      30  77.78%   18-20, 36-38, 61, 70-74, 113, 142-146, 149-153, 164-168, 186, 259
crates/a2a-gateway/src/policy/tier3_redaction/gate.rs                                         3       0  100.00%
crates/a2a-gateway/src/policy/tier3_redaction/rewrite.rs                                     49       0  100.00%
crates/a2a-redaction/src/a2a_method.rs                                                       41       0  100.00%
crates/a2a-redaction/src/wasm_bundle_path.rs                                                 18       0  100.00%
crates/a2a-redaction/src/tier3_sentinel.rs                                                   12       0  100.00%
crates/a2a-redaction/src/skill_id.rs                                                         26       0  100.00%
crates/a2a-redaction/src/skill_manifest.rs                                                  310      14  95.48%   139, 169-171, 177, 184-188, 358-360, 452
crates/a2a-redaction/src/redactor.rs                                                         32       0  100.00%
crates/trogon-gateway/src/source/slack/config.rs                                             32       0  100.00%
crates/trogon-gateway/src/source/slack/server.rs                                            272       0  100.00%
crates/trogon-gateway/src/source/slack/socket_mode.rs                                       139       0  100.00%
crates/trogon-gateway/src/source/slack/signature.rs                                          17       0  100.00%
crates/a2a-nats/src/jetstream/consumers.rs                                                   50       0  100.00%
crates/a2a-nats/src/jetstream/stream_options.rs                                              50       0  100.00%
crates/a2a-nats/src/jetstream/provision.rs                                                   16       0  100.00%
crates/a2a-nats/src/jetstream/streams.rs                                                      9       0  100.00%
crates/a2a-nats-http/src/headers.rs                                                         129       1  99.22%   159
crates/a2a-nats-http/src/main.rs                                                              1       0  100.00%
crates/a2a-nats-http/src/rest.rs                                                            316       8  97.47%   123-126, 282-285
crates/a2a-nats-http/src/runtime.rs                                                           8       8  0.00%    60-130
crates/a2a-nats-http/src/router.rs                                                           55      13  76.36%   60-63, 69-79
crates/a2a-nats-http/src/sse.rs                                                              44      27  38.64%   15-51, 61-62, 65-68
crates/trogon-std/src/dirs/system.rs                                                         39       0  100.00%
crates/trogon-std/src/dirs/fixed.rs                                                          32       0  100.00%
crates/trogon-std/src/fs/system.rs                                                           15       0  100.00%
crates/trogon-std/src/fs/mem.rs                                                              85       0  100.00%
crates/trogon-scheduler/src/processor/execution/worker/dispatcher.rs                        280       1  99.64%   200
crates/trogon-scheduler/src/processor/execution/worker/processor.rs                         303      12  96.04%   279, 339, 437-438, 444, 499-501, 533-536
crates/trogon-scheduler/src/processor/execution/worker/consumer.rs                           77       0  100.00%
crates/trogon-scheduler/src/processor/execution/worker/testkit.rs                           311       4  98.71%   458, 489-490, 495
crates/trogon-decider-runtime/src/execution.rs                                              379       0  100.00%
crates/trogon-gateway/src/source/sentry/signature.rs                                          6       0  100.00%
crates/trogon-gateway/src/source/sentry/sentry_client_secret.rs                               9       0  100.00%
crates/trogon-gateway/src/source/sentry/server.rs                                            69       0  100.00%
crates/trogon-gateway/src/source/standard_webhooks.rs                                       138       0  100.00%
crates/a2a-bridge/src/auth/callout_mint.rs                                                   49       1  97.96%   94
crates/trogon-scheduler/src/processor/execution/checkpoints/codec/twin.rs                    96       0  100.00%
crates/trogon-telemetry/src/trace.rs                                                         15       1  93.33%   24
crates/trogon-telemetry/src/service_name.rs                                                  17       0  100.00%
crates/trogon-telemetry/src/lib.rs                                                          135      23  82.96%   119, 124, 129, 139-140, 146-164, 200, 203, 206, 212
crates/trogon-telemetry/src/metric.rs                                                        18       1  94.44%   30
crates/trogon-telemetry/src/resource_attribute.rs                                            13       0  100.00%
crates/trogon-telemetry/src/log.rs                                                           36       0  100.00%
crates/acp-nats/src/req_id.rs                                                                21       0  100.00%
crates/acp-nats/src/lib.rs                                                                   11       0  100.00%
crates/acp-nats/src/pending_prompt_waiters.rs                                                68       0  100.00%
crates/acp-nats/src/config.rs                                                                84       0  100.00%
crates/acp-nats/src/client_proxy.rs                                                          63       1  98.41%   55
crates/acp-nats/src/session_id.rs                                                            21       0  100.00%
crates/acp-nats/src/wire.rs                                                                  80      14  82.50%   38, 46-60, 103
crates/acp-nats/src/in_flight_slot_guard.rs                                                   7       0  100.00%
crates/acp-nats/src/acp_prefix.rs                                                            13       0  100.00%
crates/acp-nats/src/error.rs                                                                 31       0  100.00%
crates/acp-nats/src/ext_method_name.rs                                                       18       0  100.00%
crates/a2a-nats-server/src/main.rs                                                            1       0  100.00%
crates/a2a-nats-server/src/noop_handler.rs                                                   22       0  100.00%
crates/a2a-nats-server/src/runtime.rs                                                        17       0  100.00%
TOTAL                                                                                     31604    1540  95.13%

Diff against main

Filename                                       Stmts    Miss  Cover
-------------------------------------------  -------  ------  --------
crates/a2a-gateway/src/runtime/streaming.rs      +35       0  +100.00%
TOTAL                                            +35       0  +0.01%

Results for commit: 2e399cc

Minimum allowed coverage is 95%

♻️ This comment has been updated with latest results

yordis added 2 commits June 29, 2026 01:16
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
…verage))

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
rsworkspace/crates/a2a-gateway/src/runtime/streaming/tests.rs (1)

82-145: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a mismatch case to lock in the dispatch-boundary contract.

These tests only cover matching or neutral payload methods, so a regression that re-parses payload.method instead of trusting method_dots would still pass. Since this wrapper exists specifically to classify at the dispatch boundary, add one test with conflicting values.

Proposed test
+#[test]
+fn classify_uses_dispatch_method_not_payload_method() {
+    let headers = headers_with_req_id("r-6");
+    let payload = br#"{"jsonrpc":"2.0","id":"r-6","method":"tasks/resubscribe","params":{"id":"t-1","last_seq":5}}"#;
+    let intent = classify_streaming_spawn("message.stream", &headers, payload);
+    match intent {
+        StreamingSpawnIntent::Spawn(StreamingIngressKind::MessageStream { .. }) => {}
+        other => panic!("expected MessageStream kind from method_dots, got {other:?}"),
+    }
+}
🤖 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 `@rsworkspace/crates/a2a-gateway/src/runtime/streaming/tests.rs` around lines
82 - 145, Add a regression test in classify_streaming_spawn to cover a
dispatch-boundary mismatch where the incoming method argument and the JSON
payload method disagree, and assert the wrapper still classifies based on the
method passed in rather than re-parsing payload.method. Place it alongside the
existing classify_returns_not_streaming_for_unrelated_method and
classify_spawns_tasks_resubscribe_kind_with_resume_cursor tests so the contract
is locked in for StreamingSpawnIntent and classify_streaming_spawn.
rsworkspace/crates/a2a-gateway/src/runtime/streaming.rs (1)

58-75: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Match on method_dots before extracting req_id.

req_id_from_headers_or_payload(...) runs before the method is known to be streaming, so the wrapper can end up parsing payload metadata for unary requests too. Since method_dots alone decides whether a request can ever spawn the pump, move the req_id lookup inside the two streaming arms.

Suggested refactor
 pub fn classify_streaming_spawn(
     method_dots: &str,
     headers: &async_nats::HeaderMap,
     payload: &[u8],
 ) -> StreamingSpawnIntent {
-    let Some(req_id) = req_id_from_headers_or_payload(headers, payload) else {
-        return StreamingSpawnIntent::NotStreaming;
-    };
     match method_dots {
-        MESSAGE_STREAM_METHOD_DOTS => StreamingSpawnIntent::Spawn(StreamingIngressKind::MessageStream { req_id }),
+        MESSAGE_STREAM_METHOD_DOTS => {
+            let Some(req_id) = req_id_from_headers_or_payload(headers, payload) else {
+                return StreamingSpawnIntent::NotStreaming;
+            };
+            StreamingSpawnIntent::Spawn(StreamingIngressKind::MessageStream { req_id })
+        }
         TASKS_RESUBSCRIBE_METHOD_DOTS => {
+            let Some(req_id) = req_id_from_headers_or_payload(headers, payload) else {
+                return StreamingSpawnIntent::NotStreaming;
+            };
             let params = json_rpc_params(payload);
             let Some(task_id) = task_id_from_resubscribe_params(&params) else {
                 return StreamingSpawnIntent::NotStreaming;
             };
             let last_seq = last_seq_from_resubscribe_params(&params).unwrap_or(0);
🤖 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 `@rsworkspace/crates/a2a-gateway/src/runtime/streaming.rs` around lines 58 -
75, The streaming intent logic in streaming::spawn should not extract req_id
before confirming the request is a streaming method. Move the
req_id_from_headers_or_payload lookup inside the MESSAGE_STREAM_METHOD_DOTS and
TASKS_RESUBSCRIBE_METHOD_DOTS arms of the match on method_dots, so unary
requests never parse payload metadata unnecessarily; keep req_id,
task_id_from_resubscribe_params, and last_seq handling within the streaming
branches only.
🤖 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 `@rsworkspace/crates/a2a-gateway/src/runtime/streaming.rs`:
- Around line 79-101: The `task_id_from_resubscribe_params` and
`last_seq_from_resubscribe_params` helpers are probing raw `serde_json::Value`
directly instead of using a validated wire type. Introduce a
`TasksResubscribeParamsWire` boundary type, parse the params once there, and
convert into the domain representation exactly once before the spawn path
continues. Keep the public flow on typed data and remove the ad-hoc `.get(...)`
validation chains from `streaming.rs`.

---

Nitpick comments:
In `@rsworkspace/crates/a2a-gateway/src/runtime/streaming.rs`:
- Around line 58-75: The streaming intent logic in streaming::spawn should not
extract req_id before confirming the request is a streaming method. Move the
req_id_from_headers_or_payload lookup inside the MESSAGE_STREAM_METHOD_DOTS and
TASKS_RESUBSCRIBE_METHOD_DOTS arms of the match on method_dots, so unary
requests never parse payload metadata unnecessarily; keep req_id,
task_id_from_resubscribe_params, and last_seq handling within the streaming
branches only.

In `@rsworkspace/crates/a2a-gateway/src/runtime/streaming/tests.rs`:
- Around line 82-145: Add a regression test in classify_streaming_spawn to cover
a dispatch-boundary mismatch where the incoming method argument and the JSON
payload method disagree, and assert the wrapper still classifies based on the
method passed in rather than re-parsing payload.method. Place it alongside the
existing classify_returns_not_streaming_for_unrelated_method and
classify_spawns_tasks_resubscribe_kind_with_resume_cursor tests so the contract
is locked in for StreamingSpawnIntent and classify_streaming_spawn.
🪄 Autofix (Beta)

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

Run ID: ea6fbd3f-04ac-44e9-a595-ebe7947b33cc

📥 Commits

Reviewing files that changed from the base of the PR and between 3155243 and f0779e0.

📒 Files selected for processing (3)
  • rsworkspace/crates/a2a-gateway/src/runtime.rs
  • rsworkspace/crates/a2a-gateway/src/runtime/streaming.rs
  • rsworkspace/crates/a2a-gateway/src/runtime/streaming/tests.rs

Comment on lines +79 to +101
/// Extract the resume task id from a `tasks/resubscribe` params
/// object. Accepts the three canonical field names (`id`, `task_id`,
/// `taskId`) so clients written against either the JSON-RPC contract
/// or the more verbose dispatch schema land at the same typed id.
#[must_use]
pub fn task_id_from_resubscribe_params(params: &Value) -> Option<A2aTaskId> {
params
.get("id")
.or_else(|| params.get("task_id"))
.or_else(|| params.get("taskId"))
.and_then(Value::as_str)
.and_then(|raw| A2aTaskId::new(raw).ok())
}

/// Extract the resume sequence number from a `tasks/resubscribe`
/// params object. Absence means "start from the latest" -- the pump
/// treats `None` as "no resume cursor" rather than "resume at 0".
#[must_use]
pub fn last_seq_from_resubscribe_params(params: &Value) -> Option<u64> {
params
.get("last_seq")
.or_else(|| params.get("lastSeq"))
.and_then(Value::as_u64)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟠 Major | 🏗️ Heavy lift

Model tasks/resubscribe params as a wire type instead of probing raw JSON.

These helpers keep untrusted serde_json::Value alive across multiple public functions and split validation across ad-hoc .get(...) chains. A dedicated TasksResubscribeParamsWire parsed once and converted into a domain value would keep the spawn path on validated data only. As per coding guidelines, "Untrusted input must use distinct *Input / *Wire / *Request types. Convert those boundary types into domain types exactly once."

🤖 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 `@rsworkspace/crates/a2a-gateway/src/runtime/streaming.rs` around lines 79 -
101, The `task_id_from_resubscribe_params` and
`last_seq_from_resubscribe_params` helpers are probing raw `serde_json::Value`
directly instead of using a validated wire type. Introduce a
`TasksResubscribeParamsWire` boundary type, parse the params once there, and
convert into the domain representation exactly once before the spawn path
continues. Keep the public flow on typed data and remove the ad-hoc `.get(...)`
validation chains from `streaming.rs`.

Source: Coding guidelines

@yordis
yordis merged commit 9e39f1b into main Jun 29, 2026
7 checks passed
@yordis
yordis deleted the yordis/feat-a2a-gateway-runtime-streaming-pump branch June 29, 2026 05:28
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