Skip to content

feat(acp): catch up to the current ACP spec and make drift observable - #477

Merged
yordis merged 23 commits into
mainfrom
yordis/check-acp-protocol-version
Jul 9, 2026
Merged

feat(acp): catch up to the current ACP spec and make drift observable#477
yordis merged 23 commits into
mainfrom
yordis/check-acp-protocol-version

Conversation

@yordis

@yordis yordis commented Jul 8, 2026

Copy link
Copy Markdown
Member
  • The pinned agent-client-protocol fell one full SDK redesign behind upstream (0.10.4 vs 1.2.0, schema 0.11.4 vs 1.4.0) with no signal: the exact pin made it invisible to dependabot, and the bridge's typed re-encode turned every unrepresentable spec feature into silent data loss against current-spec peers (additionalDirectories stripped, session/delete unroutable, new session/update variants dropped on decode).
  • Tracking now exists so this cannot recur silently: a conformance matrix with an upgrade ritual (docs/architecture/acp-conformance.md), a weekly freshness workflow that files a checklist-bearing drift issue, and ADRs 0017/0018 recording why the bridge owns its handler traits and keeps typed decode. Closes ACP SDK migration: agent-client-protocol 0.10.4 to 1.2.x #474.
  • Unstable spec features are adopted ahead of stabilization by policy; the only opt-out is providers at the byte-stream boundary, blocked because upstream omits the provider variants from its request enums (rationale in the matrix).
  • session/set_model is removed because upstream deleted the API; external runner repos that publish to that subject must migrate to model_config session config options before upgrading against this bridge.
  • The migration surfaced two latent correctness defects worth reviewer attention: the 1.x SDK treats peer EOF as graceful and would keep bridge connections alive forever (fixed with an EOF-signaling reader), and boundary handlers originally ran on the SDK dispatch loop, serializing all requests on a connection and making cancellation unreachable (fixed by spawning handler work onto the connection task actor).

yordis added 7 commits July 7, 2026 18:06
The pinned agent-client-protocol fell one major redesign behind upstream
without any signal, and the bridge's typed re-encode turns spec lag into
silent data loss. Record the spec position, make drift observable, and
make feature mapping a mandatory part of every future bump.

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

The bridge re-encodes typed structs, so any field the pinned SDK does not
compile in is silently stripped. additionalDirectories is stable in the
current ACP spec and peers already send it. Elicitation and NES follow
the opt-in-ahead-of-stable policy. Unknown session/update variants now
emit an error metric instead of vanishing.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
…ed handler traits

The 0.10.4 SDK is one full redesign behind upstream, and every spec
feature it cannot express is silently stripped by the bridge's typed
re-encode. The 1.x SDK removed the Agent/Client traits our routing was
built on, so per ADR 0017 the bridge now owns its handler contract.
session/set_model is gone because upstream deleted the API. The direct
schema dependency exists to enable schema-level unstable flags the SDK
facade does not forward, per the opt-in-ahead-of-stable policy.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
…ed AgentHandler trait

The SDK 1.x removed the Agent trait this crate dispatched against, and
upstream deleted session/set_model from the protocol. Runners now
implement acp_nats::AgentHandler per ADR 0017. Unhandled ext methods
surface MethodNotFound instead of silently succeeding, matching every
other defaulted method.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
The 1.x SDK removed AgentSideConnection, so the server and stdio
boundaries now compose the shared acp_nats::boundary adapters per
ADR 0017. The SDK treats incoming EOF as a graceful stream end and
keeps connections alive forever; an EOF-signaling reader restores the
old close-on-disconnect semantics. ADR 0018 records why the bridge
keeps typed decode instead of adopting passthrough forwarding.
session/delete groundwork lands in semconv; the set_model span is gone
with the protocol method.

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

session/delete has been stable in the spec since schema 0.13.6 and was
unroutable here. Cancellation exposed a deeper defect: boundary handlers
ran inline on the SDK dispatch loop, so one in-flight request blocked
every other message on the connection, including the cancellation that
would have freed it. Handler work now runs on the connection task actor.
Round-trip tests pin every newly representable session/update variant so
the next schema bump cannot silently regress them.

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

The opt-in-ahead-of-stable policy requires every unstable spec feature
to traverse the bridge before peers depend on it. Elicitation routes end
to end including enum option descriptions. Providers are fully routed on
the NATS leg; the SDK 1.2.0 byte-stream boundary cannot dispatch them
because upstream omits the provider variants from its request enums,
which the conformance matrix records as the blocking rationale.
MCP-over-ACP payloads round-trip so acp-transport MCP servers survive
session setup.

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

cursor Bot commented Jul 8, 2026

Copy link
Copy Markdown

PR Summary

High Risk
Large migration of the core ACP protocol path (typed decode, NATS/JetStream routing, and all byte-stream boundaries); incorrect handling would cause silent data loss or stuck connections, though the new conformance docs and tests target that risk.

Overview
Brings the ACP bridge current with upstream 1.x by pinning agent-client-protocol 1.2.0 and schema 1.4.0, replacing the removed SDK Agent/Client traits with bridge-owned AgentHandler/ClientHandler, and routing through schema::v1 types. WebSocket, HTTP duplex, and stdio now share connect_agent_boundary (SDK builder + ByteStreams), with handler work spawned off the dispatch loop for $/cancel_request, an EOF-signaling reader so peer close does not leave connections hanging, and AbortOnDrop for boundary tasks.

Wire surface changes: adds NATS/agent dispatch for session/delete and global providers/list, providers/set, providers/disable; drops upstream-removed session/set_model (model switching via model_config config options). Telemetry registry drops set_model spans and adds delete/providers/elicitation spans.

Drift is now explicit: docs/architecture/acp-conformance.md (matrix + upgrade ritual), ADRs 0020/0021, weekly .github/workflows/acp-freshness.yml + mise task that opens/updates a checklist issue when crates.io moves ahead of the pin.

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

@coderabbitai

coderabbitai Bot commented Jul 8, 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: 50 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
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 refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 5f2a045a-2fd1-4885-a6ad-90938877a484

📥 Commits

Reviewing files that changed from the base of the PR and between 3616174 and 270f941.

📒 Files selected for processing (2)
  • rsworkspace/crates/acp-nats/src/boundary/connect_agent_boundary.rs
  • rsworkspace/crates/acp-nats/src/boundary/connect_agent_boundary/tests.rs

Walkthrough

Migrates the ACP bridge to SDK/schema 1.x, replacing removed SDK traits with bridge-owned handler traits and boundary wiring. It adds session delete, provider management, and elicitation routing, updates transport/server/stdio integration, and adds ACP conformance docs, freshness automation, and a new dylint.

Changes

ACP SDK 1.x Migration

Layer / File(s) Summary
Planning docs and freshness CI
.config/mise/tasks/acp-freshness, .github/workflows/acp-freshness.yml, docs/adr/0020-*.md, docs/adr/0021-*.md, docs/adr/index.md, docs/architecture/acp-conformance.md, docs/.vitepress/config.mts, rsworkspace/crates/AGENTS.md
Adds the drift-checking task/workflow, ADRs, conformance document, docs navigation, and AGENTS guidance.
Semantic conventions
otel/semconv/registry/acp.yaml
Removes model_id and session.set_model, and adds session.delete, provider, and elicitation spans.
Workspace dependency bump
rsworkspace/Cargo.toml, rsworkspace/crates/acp-nats*/Cargo.toml
Updates ACP package pins and workspace dependency wiring for the SDK/schema split.
Handler traits and boundary layer
rsworkspace/crates/acp-nats/src/agent_handler.rs, client_handler.rs, boundary/*.rs, lib.rs
Introduces AgentHandler, ClientHandler, and the boundary helpers that connect the handler model to byte streams.
Agent handlers and routing
rsworkspace/crates/acp-nats/src/agent/*.rs, nats/parsing.rs, nats/subjects/*
Adds delete/provider handling, updates agent imports/tests, and adds matching NATS parsing and subject types.
Client handlers and elicitation
rsworkspace/crates/acp-nats/src/client/*.rs, client_proxy.rs, client/mod.rs
Migrates client handlers to ClientHandler and adds elicitation create/complete request and notification flow.
Server, stdio, and agent connection wiring
rsworkspace/crates/acp-nats-server/*, rsworkspace/crates/acp-nats-stdio/src/main.rs, rsworkspace/crates/acp-nats-agent/src/connection.rs
Replaces AgentSideConnection/Rc orchestration with connect_agent_boundary/Arc and updates delete/provider dispatch paths.
Wire helpers and round-trip tests
rsworkspace/crates/acp-nats/src/wire.rs, session_id.rs, pending_prompt_waiters.rs, tests.rs, wire/tests.rs
Moves helper types to schema::v1 and expands encode/decode round-trip coverage for new ACP payloads.

Function-local macro_rules Dylint

Layer / File(s) Summary
Lint implementation and fixtures
rsworkspace/dylints/trogon_lints/src/function_local_macro_rules.rs, lib.rs, ui/function_local_macro_rules.rs, .stderr
Adds the lint, registers it, and includes UI tests for function-local macro_rules! diagnostics.

Estimated code review effort: 5 (Critical) | ~150 minutes

Possibly related PRs

Suggested labels: rust:coverage-baseline-reset

Poem

A rabbit hops through schema new,
Traits replaced, the old ones through 🐇
Providers, deletes, elicitation too,
Boundaries hum with tasks in queue.
Cargo bumped, the drift checked clean —
Hop hop hop, the cleanest migration seen!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning It also includes unrelated changes, notably a new trogon lint and an a2a-nats-stdio dispatch tweak, which are outside the ACP migration scope. Split unrelated linting and A2A dispatch changes into separate PRs, or explain why they are required for the ACP migration.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately summarizes the main ACP migration and drift-tracking changes.
Description check ✅ Passed The description is clearly about the ACP SDK migration, conformance docs, and drift detection work.
Linked Issues check ✅ Passed The PR upgrades agent-client-protocol to 1.2.0/schema 1.4.0 and adds the conformance and upgrade ritual described in #474.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch yordis/check-acp-protocol-version

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.

Comment thread rsworkspace/crates/acp-nats/src/boundary/connect_agent_boundary.rs
yordis added 2 commits July 8, 2026 16:22
The conformance matrix, upgrade ritual, and ADRs carry the durable
decisions; the plan was session scaffolding.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
The working plan file is gone; the tracking issue and freshness
workflow are the long-lived anchors.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Comment thread rsworkspace/crates/acp-nats-server/src/transport.rs
The registration chain was fifteen anonymous closure blocks; reviewers
could not see the routed surface at a glance. Each handler is now a
named function and registration reads as a routing table. A local macro
does the Arc binding because return-position AsyncFnMut cannot promise
Send futures on stable Rust yet.

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

@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 1 potential issue.

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 01f70c0. Configure here.

Comment thread rsworkspace/crates/acp-nats/src/boundary/eof_signal_reader.rs
yordis added 4 commits July 8, 2026 17:00
Inline workflow bash cannot be run or tested locally; as a mise task the
same script serves developers and CI, and the workflow shrinks to
checkout, run, file issue.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Main claimed ADR numbers 0017 through 0019, so the ACP boundary and
typed-decode ADRs move to 0020 and 0021 with references updated.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Workflow YAML cannot be exercised locally; with the whole flow in the
task, the workflow is checkout plus one invocation, and issue filing
stays opt-in so local runs are read-only.

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

Function-local macros lean on definition-site hygiene to silently
capture surrounding locals, hiding the macro's real inputs. The
boundary routing macros now live at module scope with the agent passed
explicitly, and the lint keeps the pattern from coming back.

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

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown

badge

Code Coverage Summary

Details
Filename                                                                                  Stmts    Miss  Cover    Missing
--------------------------------------------------------------------------------------  -------  ------  -------  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
crates/acp-nats/src/agent/initialize.rs                                                       6       0  100.00%
crates/acp-nats/src/agent/prompt.rs                                                         156       7  95.51%   202-208
crates/acp-nats/src/agent/cancel.rs                                                          12       0  100.00%
crates/acp-nats/src/agent/providers_list.rs                                                   5       0  100.00%
crates/acp-nats/src/agent/resume_session.rs                                                  16       0  100.00%
crates/acp-nats/src/agent/set_session_config_option.rs                                       16       0  100.00%
crates/acp-nats/src/agent/logout.rs                                                           5       0  100.00%
crates/acp-nats/src/agent/load_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/authenticate.rs                                                     5       0  100.00%
crates/acp-nats/src/agent/ext_notification.rs                                                12       0  100.00%
crates/acp-nats/src/agent/list_sessions.rs                                                    5       0  100.00%
crates/acp-nats/src/agent/delete_session.rs                                                  16       0  100.00%
crates/acp-nats/src/agent/test_support.rs                                                   194       0  100.00%
crates/acp-nats/src/agent/new_session.rs                                                      5       0  100.00%
crates/acp-nats/src/agent/providers_disable.rs                                                5       0  100.00%
crates/acp-nats/src/agent/rpc_call.rs                                                        23       0  100.00%
crates/acp-nats/src/agent/bridge.rs                                                         138       4  97.10%   119-122
crates/acp-nats/src/agent/close_session.rs                                                   16       0  100.00%
crates/acp-nats/src/agent/ext_method.rs                                                      12       0  100.00%
crates/acp-nats/src/agent/fork_session.rs                                                    16       0  100.00%
crates/acp-nats/src/agent/set_session_mode.rs                                                16       0  100.00%
crates/acp-nats/src/agent/providers_set.rs                                                    5       0  100.00%
crates/acp-nats/src/nats/jsonrpc.rs                                                          51      11  78.43%   46, 54-55, 57-63, 81-83
crates/acp-nats/src/nats/extensions.rs                                                        3       0  100.00%
crates/acp-nats/src/nats/mod.rs                                                              61      13  78.69%   22-33, 75
crates/acp-nats/src/nats/parsing.rs                                                         123       0  100.00%
crates/a2a-nats/src/nats/subjects/tasks/events.rs                                            17       0  100.00%
crates/a2a-redaction/src/bin/sign-bundle.rs                                                   1       1  0.00%    163
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/acp-nats/src/nats/subjects/responses/update.rs                                        20       0  100.00%
crates/acp-nats/src/nats/subjects/responses/ext_ready.rs                                     12       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/acp-nats/src/nats/subjects/responses/response.rs                                      20       0  100.00%
crates/acp-nats-server/src/config.rs                                                         39       0  100.00%
crates/acp-nats-server/src/main.rs                                                           68       1  98.53%   109
crates/acp-nats-server/src/acp_connection_id.rs                                              14       0  100.00%
crates/acp-nats-server/src/connection.rs                                                    102      22  78.43%   83-90, 102, 113-115, 124-125, 130, 134, 138, 141, 149, 153, 156, 159-163
crates/acp-nats-server/src/transport.rs                                                    1018     101  90.08%   245, 293-295, 530, 548, 575, 629, 634, 654, 673, 716-729, 818, 841-843, 895, 912-915, 1011-1014, 1082, 1085, 1088, 1097, 1101, 1104, 1107-1110, 1139, 1172-1175, 1183-1188, 1200-1204, 1208-1217, 1229-1230, 1248-1249, 1259, 1275-1279, 1307-1313, 1333-1335, 1340-1344, 1357, 1368, 1450-1451, 1463-1464, 1484-1485
crates/a2a-auth-callout/src/signing_key_source/env.rs                                        40       0  100.00%
crates/a2a-auth-callout/src/signing_key_source/key_version.rs                                16       0  100.00%
crates/a2a-auth-callout/src/signing_key_source/minting_material.rs                           18       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/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/file.rs                                       38       6  84.21%   40-42, 61-63
crates/a2a-auth-callout/src/signing_key_source/loader.rs                                     23       0  100.00%
crates/a2a-nats-http/src/main.rs                                                              1       0  100.00%
crates/a2a-nats-http/src/runtime.rs                                                           8       8  0.00%    60-130
crates/a2a-nats-http/src/rest.rs                                                            316       8  97.47%   123-126, 282-285
crates/a2a-nats-http/src/headers.rs                                                         129       1  99.22%   159
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-nats/src/telemetry/messaging.rs                                                37       0  100.00%
crates/trogon-scheduler-domain/src/subject.rs                                                26       0  100.00%
crates/a2a-nats/src/task_id.rs                                                               22       0  100.00%
crates/a2a-nats/src/a2a_prefix.rs                                                            16       0  100.00%
crates/a2a-nats/src/gateway_ingress.rs                                                      153      21  86.27%   165-168, 172, 186, 194-200, 233, 248-254
crates/a2a-nats/src/context_id.rs                                                            22       0  100.00%
crates/a2a-nats/src/agent_id.rs                                                              21       0  100.00%
crates/a2a-nats/src/req_id.rs                                                                21       0  100.00%
crates/a2a-nats/src/jsonrpc.rs                                                               27       0  100.00%
crates/a2a-nats/src/wire.rs                                                                  59       2  96.61%   85, 98
crates/a2a-nats/src/config.rs                                                               114       0  100.00%
crates/a2a-nats/src/push/dispatcher/composite.rs                                             15       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/mod.rs                                                   16       0  100.00%
crates/a2a-nats/src/push/dispatcher/nats.rs                                                  37       0  100.00%
crates/a2a-nats/src/server/handler.rs                                                        39       0  100.00%
crates/a2a-nats/src/server/agent_card.rs                                                     16       0  100.00%
crates/a2a-nats/src/server/tasks_get.rs                                                      12       0  100.00%
crates/a2a-nats/src/server/message_send.rs                                                   15       0  100.00%
crates/a2a-nats/src/server/push_set.rs                                                       12       0  100.00%
crates/a2a-nats/src/server/test_support.rs                                                   81      25  69.14%   134-159
crates/a2a-nats/src/server/message_stream.rs                                                 56       6  89.29%   155-157, 165-167
crates/a2a-nats/src/server/bridge.rs                                                         65       0  100.00%
crates/a2a-nats/src/server/tasks_cancel.rs                                                   12       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/push_delete.rs                                                    12       0  100.00%
crates/a2a-nats/src/server/push_list.rs                                                      12       0  100.00%
crates/a2a-nats/src/server/wire.rs                                                           34       4  88.24%   21-23, 30
crates/a2a-nats/src/server/push_get.rs                                                       12       0  100.00%
crates/a2a-nats/src/server/tasks_list.rs                                                     12       0  100.00%
crates/trogon-aauth-person/src/subagent.rs                                                   10       0  100.00%
crates/trogon-aauth-person/src/mission.rs                                                    65       0  100.00%
crates/trogon-aauth-person/src/agent.rs                                                      84       0  100.00%
crates/trogon-aauth-person/src/pending.rs                                                    73       0  100.00%
crates/trogon-aauth-person/src/mint.rs                                                       59       0  100.00%
crates/trogon-aauth-person/src/login.rs                                                       3       0  100.00%
crates/trogon-aauth-person/src/interaction.rs                                                 2       0  100.00%
crates/trogon-aauth-person/src/server.rs                                                    353       0  100.00%
crates/trogon-aauth-person/src/store.rs                                                      21       0  100.00%
crates/trogon-aauth-person/src/error.rs                                                      48       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-gateway/src/source/telegram/server.rs                                          53       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/config.rs                                          42       0  100.00%
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/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/a2a-auth-callout/src/wire/server_auth_request_claims.rs                              100       4  96.00%   24-26, 127
crates/a2a-auth-callout/src/wire/wire_codec.rs                                               58       0  100.00%
crates/a2a-auth-callout/src/wire/xkey_public.rs                                              23       0  100.00%
crates/a2a-auth-callout/src/wire/nkey_public.rs                                              83       3  96.39%   102, 118-119
crates/a2a-auth-callout/src/wire/test_encode.rs                                              59       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/trogon-scheduler/src/queries/read_model/schedule.rs                                   15       0  100.00%
crates/trogon-scheduler/src/queries/read_model/message.rs                                    77       0  100.00%
crates/trogon-gateway/src/source_plugin.rs                                                  288       3  98.96%   83, 140-141
crates/trogon-gateway/src/config.rs                                                        1172      32  97.27%   82, 689, 856, 1003, 1006, 1015, 1101-1108, 1186, 1189, 1198, 1257, 1260, 1344, 1347, 1356, 1421, 1424, 1501, 1504, 1513, 1589, 1592, 1606, 1665, 1668, 1978-1980
crates/trogon-gateway/src/main.rs                                                            26       0  100.00%
crates/trogon-gateway/src/http.rs                                                            13       0  100.00%
crates/trogon-gateway/src/source_status.rs                                                   12       0  100.00%
crates/trogon-gateway/src/source_integration_id.rs                                           28       2  92.86%   58, 60
crates/trogon-gateway/src/streams.rs                                                          7       0  100.00%
crates/mcp-nats/src/telemetry/transport.rs                                                    6       0  100.00%
crates/a2a-redaction/src/signed_bundle/verify.rs                                             64       2  96.88%   90-91
crates/a2a-redaction/src/signed_bundle/manifest.rs                                           56       1  98.21%   83
crates/a2a-redaction/src/signed_bundle/public_key.rs                                         36       2  94.44%   44-45
crates/a2a-redaction/src/signed_bundle/signature.rs                                          30       3  90.00%   37-39
crates/a2a-redaction/src/signed_bundle/digest.rs                                             26       0  100.00%
crates/acp-nats/src/client/test_support.rs                                                   17       0  100.00%
crates/acp-nats/src/client/ext_session_prompt_response.rs                                    22       0  100.00%
crates/acp-nats/src/client/ext.rs                                                            62       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/request_permission.rs                                             40       0  100.00%
crates/acp-nats/src/client/terminal_create.rs                                                41       0  100.00%
crates/acp-nats/src/client/elicitation_complete.rs                                            8       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%   60
crates/acp-nats/src/client/elicitation_create.rs                                             41       0  100.00%
crates/acp-nats/src/client/terminal_kill.rs                                                  41       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/session_update.rs                                                  8       0  100.00%
crates/acp-nats/src/client/fs_write_text_file.rs                                             43       0  100.00%
crates/acp-nats/src/client/terminal_wait_for_exit.rs                                         55       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_envelope_decode_error.rs            6       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_encode_error.rs                    16       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/snapshot_payload_decode.rs                   3       0  100.00%
crates/trogon-aauth-sdk/src/exchange/challenge.rs                                            50       0  100.00%
crates/trogon-aauth-sdk/src/exchange/core.rs                                                138       0  100.00%
crates/trogon-aauth-sdk/src/exchange/client.rs                                              283       0  100.00%
crates/trogon-aauth-sdk/src/exchange/mod.rs                                                  17       0  100.00%
crates/mcp-nats/src/nats/subjects/client/create_message.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/initialized.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/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_elicitation.rs                               12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/roots_list_changed.rs                               12       0  100.00%
crates/jsonrpc-nats/src/message.rs                                                           11       3  72.73%   37-39
crates/jsonrpc-nats/src/transport.rs                                                         92       1  98.91%   106
crates/jsonrpc-nats/src/id.rs                                                                62      20  67.74%   44-61, 81-82, 84-85, 91-92, 98-99, 112
crates/trogon-decider-runtime/src/headers/header_name.rs                                     28       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-scheduler/src/processor/execution/execution_schedules/mod.rs                   82       0  100.00%
crates/trogon-decider/src/event/codec/event_payload_error.rs                                  5       0  100.00%
crates/trogon-decider/src/event/codec/event_decode.rs                                        13       0  100.00%
crates/trogon-scheduler/src/processor/execution/wakeup.rs                                    91       1  98.90%   127
crates/trogon-decider/src/decision.rs                                                        27       0  100.00%
crates/trogon-decider/src/act.rs                                                             62       0  100.00%
crates/trogon-decider/src/lib.rs                                                              4       0  100.00%
crates/trogon-decider/src/testing.rs                                                        274       0  100.00%
crates/trogon-decider/src/events.rs                                                          49       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/ard-catalog/src/ard_storage_key.rs                                                    10       0  100.00%
crates/ard-catalog/src/display_name.rs                                                       13       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/trust_manifest.rs                                                     45       1  97.78%   35
crates/ard-catalog/src/catalog_entry.rs                                                     107       0  100.00%
crates/ard-catalog/src/catalog_manifest.rs                                                   44       0  100.00%
crates/ard-catalog/src/catalog_entry_wire.rs                                                  3       0  100.00%
crates/ard-catalog/src/federation_mode.rs                                                     3       0  100.00%
crates/ard-catalog/src/catalog_host.rs                                                       26       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/ard-catalog/src/catalog_host_wire.rs                                                   6       0  100.00%
crates/ard-catalog/src/ard_identifier.rs                                                     54       0  100.00%
crates/ard-catalog/src/media_type.rs                                                         20       0  100.00%
crates/ard-catalog/src/registry_error_wire.rs                                                 8       0  100.00%
crates/ard-catalog/src/url_or_data.rs                                                        20       0  100.00%
crates/acp-nats/src/nats/subjects/stream.rs                                                  56       0  100.00%
crates/trogon-aauth-as/src/server.rs                                                        139       0  100.00%
crates/trogon-aauth-as/src/http.rs                                                           82       0  100.00%
crates/trogon-aauth-as/src/mint.rs                                                           56       0  100.00%
crates/trogon-aauth-as/src/pending.rs                                                        26       0  100.00%
crates/trogon-aauth-as/src/trust.rs                                                          60       0  100.00%
crates/trogon-aauth-as/src/verify.rs                                                         96       0  100.00%
crates/trogon-aauth-as/src/test_support.rs                                                  122       0  100.00%
crates/trogon-aauth-as/src/subagent.rs                                                       10       0  100.00%
crates/trogon-aauth-as/src/policy.rs                                                         38       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/snapshot/mod.rs                                             3       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/a2a-auth-callout/src/account_resolver.rs                                              31       0  100.00%
crates/a2a-auth-callout/src/denial_claims.rs                                                 68       0  100.00%
crates/a2a-auth-callout/src/permissions.rs                                                   85       0  100.00%
crates/a2a-auth-callout/src/dispatcher.rs                                                    34      13  61.76%   83-112
crates/a2a-auth-callout/src/subscriber.rs                                                    96      96  0.00%    27-178
crates/a2a-auth-callout/src/test_support.rs                                                  20      20  0.00%    16-36
crates/a2a-auth-callout/src/denial_category.rs                                               29       0  100.00%
crates/a2a-auth-callout/src/main.rs                                                           1       1  0.00%    226
crates/a2a-auth-callout/src/caller_jwt_header.rs                                             20       0  100.00%
crates/a2a-auth-callout/src/error.rs                                                          3       0  100.00%
crates/a2a-auth-callout/src/denial_reason.rs                                                 15       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/jetstream/provision.rs                                                   16       0  100.00%
crates/a2a-nats/src/jetstream/stream_options.rs                                              50       0  100.00%
crates/a2a-nats/src/jetstream/consumers.rs                                                   50       0  100.00%
crates/a2a-nats/src/jetstream/streams.rs                                                      9       0  100.00%
crates/a2a-pack/src/agent_card_schema.rs                                                     40       0  100.00%
crates/a2a-pack/src/agent_card_read.rs                                                       23       0  100.00%
crates/a2a-pack/src/resource_tuples.rs                                                      152       0  100.00%
crates/trogon-gateway/src/source/slack/socket_mode.rs                                       139       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/signature.rs                                          17       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/a2a-nats-http/src/handlers/mod.rs                                                    185      12  93.51%   68, 88-91, 121, 155, 169-172, 185
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/create_conflicts.rs                                         14       0  100.00%
crates/trogon-nats/src/jetstream/mocks.rs                                                   941       1  99.89%   507
crates/trogon-nats/src/jetstream/publish.rs                                                  30       0  100.00%
crates/a2a-redaction/src/wasm/engine.rs                                                      62      11  82.26%   46-48, 80-81, 93-95, 99-101
crates/a2a-redaction/src/wasm/mod.rs                                                        110       9  91.82%   132-134, 147-149, 162-164
crates/trogon-nats/src/mocks.rs                                                             224       0  100.00%
crates/trogon-nats/src/server_info.rs                                                        21       3  85.71%   19-21
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/nats_token.rs                                                         56       0  100.00%
crates/trogon-nats/src/auth.rs                                                               45       0  100.00%
crates/trogon-nats/src/messaging.rs                                                         168       2  98.81%   146, 156
crates/trogon-nats/src/client.rs                                                             22      22  0.00%    50-86
crates/trogon-scheduler-domain/src/commands/pause_schedule.rs                                31       0  100.00%
crates/trogon-scheduler-domain/src/commands/proto_wire.rs                                   138       1  99.28%   231
crates/trogon-scheduler-domain/src/commands/remove_schedule.rs                               30       0  100.00%
crates/trogon-scheduler-domain/src/commands/state.rs                                         82       0  100.00%
crates/trogon-scheduler-domain/src/commands/create_schedule.rs                               32       0  100.00%
crates/trogon-scheduler-domain/src/commands/resume_schedule.rs                               34       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/a2a-nats/src/catalog/agent_view.rs                                                    47       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/store.rs                                                        117       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/client/handle.rs                                                        218       0  100.00%
crates/a2a-nats/src/client/error.rs                                                          14       0  100.00%
crates/a2a-nats/src/client/wire.rs                                                           13       0  100.00%
crates/a2a-nats/src/client/event_stream.rs                                                   76       0  100.00%
crates/a2a-nats/src/client/gateway_headers.rs                                                19       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/unary.rs                                                          39       1  97.44%   57
crates/acp-nats/src/boundary/abort_on_drop.rs                                                16       0  100.00%
crates/acp-nats/src/boundary/connection_client.rs                                            29       0  100.00%
crates/acp-nats/src/boundary/connect_agent_boundary.rs                                      199       0  100.00%
crates/acp-nats/src/boundary/eof_signal_reader.rs                                            20       0  100.00%
crates/mcp-nats/src/nats/subjects/server/read_resource.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/cancelled.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/list_tasks.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/set_logging_level.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/resource_updated.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/initialize.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/prompt_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/resource_list_changed.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/unsubscribe_resource.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_prompt.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/ping.rs                                              9       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/list_tools.rs                                       12       0  100.00%
crates/trogon-decider-runtime/src/execution.rs                                              379       0  100.00%
crates/trogon-scheduler/src/commands/domain/recurrence.rs                                    78       1  98.72%   99
crates/trogon-scheduler/src/commands/domain/schedule_occurrence_sequence.rs                  16       0  100.00%
crates/trogon-scheduler/src/projections/schedules/storage.rs                                  3       0  100.00%
crates/trogon-scheduler/src/projections/schedules/mod.rs                                    175       3  98.29%   708-710
crates/trogon-scheduler/src/projections/schedules/twin.rs                                    53       0  100.00%
crates/acp-nats/src/nats/subjects/commands/load.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/delete.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/fork.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/resume.rs                                         15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_config_option.rs                              15       0  100.00%
crates/trogon-scheduler/src/queries/schedule_id.rs                                           28       0  100.00%
crates/trogon-scheduler/src/queries/get_schedule.rs                                           3       0  100.00%
crates/trogon-scheduler/src/queries/decode.rs                                                95       0  100.00%
crates/trogon-std/src/env/enumerate_env.rs                                                    6       0  100.00%
crates/trogon-std/src/env/in_memory.rs                                                       30       0  100.00%
crates/trogon-std/src/env/system.rs                                                          12       0  100.00%
crates/trogon-std/src/env/read_env.rs                                                         3       0  100.00%
crates/a2a-gateway/src/policy/tier2/rule_name.rs                                             19       0  100.00%
crates/a2a-gateway/src/policy/tier2/mod.rs                                                   46       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/a2a-bridge/src/auth/callout_mint.rs                                                   49       1  97.96%   94
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/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/failure.rs                       27       0  100.00%
crates/trogon-scheduler/src/processor/execution/checkpoints/record.rs                         6       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/context.rs                                     40       0  100.00%
crates/a2a-gateway/src/policy/tier3_redaction/mod.rs                                         33       2  93.94%   54, 58
crates/a2a-gateway/src/policy/tier3_redaction/rewrite.rs                                     49       0  100.00%
crates/a2a-gateway/src/policy/tier3_redaction/gate.rs                                         3       0  100.00%
crates/a2a-gateway/src/policy/tier3_redaction/real_gate.rs                                  138      33  76.09%   18-26, 42-44, 67, 76-80, 119, 148-152, 155-159, 170-174, 192, 265
crates/a2a-gateway/src/policy/tier3_redaction/manifest.rs                                    69       3  95.65%   112, 121, 132
crates/a2a-gateway/src/policy/tier3_redaction/decision.rs                                    22       0  100.00%
crates/trogon-service-config/src/lib.rs                                                      38       0  100.00%
crates/trogon-gateway/src/source/datadog/datadog_event_type.rs                               20       0  100.00%
crates/trogon-gateway/src/source/datadog/signature.rs                                         7       0  100.00%
crates/trogon-gateway/src/source/datadog/server.rs                                          108       0  100.00%
crates/trogon-gateway/src/source/datadog/datadog_webhook_token.rs                             9       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_server.rs                                 9       0  100.00%
crates/mcp-nats/src/nats/subjects/subscriptions/one_client.rs                                 9       0  100.00%
crates/mcp-nats/src/nats/subjects/subscriptions/all_client.rs                                 6       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/reconcile.rs                 303      13  95.71%   251-260, 325-327
crates/trogon-scheduler/src/processor/execution/reconciliation/go_duration.rs                40       0  100.00%
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/schedule_key.rs               27       0  100.00%
crates/trogon-scheduler/src/processor/execution/reconciliation/request.rs                   230       2  99.13%   285, 290
crates/acp-nats/src/nats/subjects/subscriptions/global_all.rs                                 9       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_agent.rs                                  9       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/all_session.rs                                9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_client.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/one_agent.rs                                 15       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/trogonai-proto/src/scheduler/schedules/codec.rs                                       57       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/time_predicate.rs                           118       2  98.31%   103, 125
crates/a2a-gateway/src/policy/tier1_declarative/evaluator.rs                                158      13  91.77%   24-26, 147, 196-198, 268-272, 295
crates/trogon-scheduler-domain/src/commands/domain/schedule_event_schedule.rs                35       0  100.00%
crates/trogon-scheduler-domain/src/commands/domain/schedule.rs                              383       5  98.69%   326, 334, 349-351
crates/trogon-scheduler-domain/src/commands/domain/schedule_id.rs                            37       0  100.00%
crates/trogon-scheduler-domain/src/commands/domain/schedule_event_status.rs                   6       0  100.00%
crates/trogon-scheduler-domain/src/commands/domain/schedule_event_delivery.rs                14       0  100.00%
crates/trogon-scheduler-domain/src/commands/domain/message.rs                               139       0  100.00%
crates/trogon-scheduler-domain/src/commands/domain/schedule_event_sampling_source.rs         11       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/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%
crates/trogon-jwks-publisher/src/provider.rs                                                118       0  100.00%
crates/trogon-jwks-publisher/src/publisher.rs                                                92       0  100.00%
crates/a2a-bridge/src/auth.rs                                                                47      15  68.09%   78-99, 148
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/main.rs                                                                 1       1  0.00%    199
crates/a2a-bridge/src/nats_transport_harness.rs                                              42       0  100.00%
crates/a2a-bridge/src/identity.rs                                                            63       0  100.00%
crates/a2a-bridge/src/outbound.rs                                                            70       7  90.00%   126, 197-209
crates/trogon-std/src/fs/mem.rs                                                              85       0  100.00%
crates/trogon-std/src/fs/system.rs                                                           15       0  100.00%
crates/mcp-nats-server/src/main.rs                                                            1       1  0.00%    67
crates/mcp-nats-server/src/runtime.rs                                                       268      86  67.91%   146-164, 200-202, 220-221, 232, 265-269, 273-282, 311-319, 324-359, 385-396
crates/mcp-nats-server/src/allowed_host.rs                                                   52       0  100.00%
crates/mcp-nats-server/src/config.rs                                                         58       0  100.00%
crates/ard-nats/src/catalog_subject.rs                                                       14       3  78.57%   19-21
crates/ard-nats/src/catalog_event.rs                                                         71       0  100.00%
crates/ard-nats/src/store.rs                                                                  3       0  100.00%
crates/ard-nats/src/catalog_index.rs                                                         82       2  97.56%   37, 104
crates/ard-nats/src/memory_catalog_store.rs                                                  32       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-decider-runtime/src/event/stream_event.rs                                       8       0  100.00%
crates/trogonai-proto/src/codec.rs                                                           16       0  100.00%
crates/trogonai-proto/src/convert.rs                                                         53       0  100.00%
crates/trogonai-proto/src/lib.rs                                                             18       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-aauth-person/src/http/mod.rs                                                  213       0  100.00%
crates/a2a-nats/src/catalog/import_gate/allow_all.rs                                          2       0  100.00%
crates/a2a-nats/src/catalog/import_gate/principal.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/get.rs                                         12       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/push/list.rs                                        15       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/push/set.rs                                         12       0  100.00%
crates/trogon-gateway/src/source/incidentio/signature.rs                                      8       0  100.00%
crates/trogon-gateway/src/source/incidentio/incidentio_signing_secret.rs                     22       0  100.00%
crates/trogon-gateway/src/source/incidentio/incidentio_event_type.rs                         20       0  100.00%
crates/trogon-gateway/src/source/incidentio/server.rs                                        72       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/trogon-gateway/src/source/sentry/server.rs                                            69       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/a2a-nats-stdio/src/dispatch.rs                                                       212       8  96.23%   121, 124-126, 234, 237-239
crates/a2a-nats-stdio/src/main.rs                                                             1       0  100.00%
crates/a2a-nats-stdio/src/runtime.rs                                                         21       0  100.00%
crates/a2a-nats-stdio/src/wire.rs                                                            22       0  100.00%
crates/a2a-nats-stdio/src/io_loop.rs                                                         49       0  100.00%
crates/trogon-decider-wit/src/lib.rs                                                         53       1  98.11%   4
crates/ard-registry/src/extract.rs                                                           12       0  100.00%
crates/ard-registry/src/page_token.rs                                                        14       0  100.00%
crates/ard-registry/src/search_filters.rs                                                    28       0  100.00%
crates/ard-registry/src/search_request.rs                                                    32       1  96.88%   43
crates/ard-registry/src/http_error.rs                                                        17       0  100.00%
crates/ard-registry/src/source_url.rs                                                        26       1  96.15%   30
crates/ard-registry/src/lexical_rank.rs                                                      55       2  96.36%   15, 64
crates/ard-registry/src/facet_field.rs                                                       13       0  100.00%
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/registry_config.rs                                                   16       0  100.00%
crates/ard-registry/src/router.rs                                                            33       0  100.00%
crates/ard-registry/src/filters.rs                                                           31       0  100.00%
crates/ard-registry/src/explore_request.rs                                                   30       0  100.00%
crates/trogon-std/src/telemetry/http.rs                                                      58       0  100.00%
crates/a2a-gateway/src/policy/spicedb_tier1.rs                                              157      13  91.72%   226-228, 381, 451, 453-461
crates/a2a-gateway/src/policy/error.rs                                                       16       0  100.00%
crates/a2a-gateway/src/policy/wasmtime_substrate.rs                                          31       0  100.00%
crates/a2a-gateway/src/policy/per_skill.rs                                                   87       0  100.00%
crates/acp-nats-stdio/src/config.rs                                                          15       0  100.00%
crates/acp-nats-stdio/src/main.rs                                                            56       8  85.71%   69, 112-119, 131
crates/trogon-aauth-sdk/src/lib.rs                                                            3       0  100.00%
crates/trogon-aauth-sdk/src/delegation.rs                                                    15       0  100.00%
crates/trogon-aauth-sdk/src/subagent.rs                                                      34       0  100.00%
crates/trogon-aauth-sdk/src/verify_response.rs                                               70       0  100.00%
crates/trogon-aauth-sdk/src/capabilities.rs                                                   7       0  100.00%
crates/trogon-aauth-sdk/src/signer.rs                                                        91       0  100.00%
crates/a2a-nats/src/push/nats_push_subject.rs                                                12       0  100.00%
crates/a2a-nats/src/push/authentication_header.rs                                            31       0  100.00%
crates/a2a-nats/src/push/delivery_semantics.rs                                               98       0  100.00%
crates/a2a-nats/src/push/dlq.rs                                                              56       0  100.00%
crates/a2a-nats/src/push/push_notification_target.rs                                         32       0  100.00%
crates/a2a-nats/src/push/push_idempotency_key.rs                                             43       0  100.00%
crates/a2a-nats/src/push/caller_id.rs                                                        41       0  100.00%
crates/a2a-nats/src/push/push_payload.rs                                                     18       0  100.00%
crates/a2a-nats/src/push/target.rs                                                           19       0  100.00%
crates/a2a-nats/src/push/terminal_push_task_state.rs                                         17       0  100.00%
crates/a2a-nats/src/push/dispatch_error.rs                                                   24       0  100.00%
crates/a2a-nats/src/push/push_delivery_semantics_registry.rs                                 17       0  100.00%
crates/a2a-nats/src/push/push_notification_config.rs                                          6       0  100.00%
crates/a2a-nats/src/push/status_transition_id.rs                                             15       0  100.00%
crates/a2a-nats/src/push/push_notification_config_id.rs                                      17       0  100.00%
crates/a2a-nats/src/push/dlq_dedup.rs                                                        51       1  98.04%   79
crates/a2a-nats/src/push/idempotency_key_header.rs                                           16       0  100.00%
crates/a2a-nats/src/nats/subjects/subscriptions/task_one_events.rs                           12       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-gateway/src/lib.rs                                                                 3       0  100.00%
crates/a2a-gateway/src/main.rs                                                                1       0  100.00%
crates/a2a-gateway/src/jwt_caller_identity.rs                                               151       4  97.35%   165-169, 182-186
crates/a2a-gateway/src/gw_pull_backpressure.rs                                              209       3  98.56%   504, 704, 717
crates/a2a-gateway/src/agent_card_surface.rs                                                  3       0  100.00%
crates/a2a-gateway/src/audit_ingress.rs                                                     110       0  100.00%
crates/a2a-gateway/src/aauth.rs                                                             285       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                                                            11       0  100.00%
crates/a2a-gateway/src/config.rs                                                             57       0  100.00%
crates/a2a-gateway/src/gw_ingress_stream.rs                                                 144       4  97.22%   319-321, 536
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/providers_list.rs                                    6       0  100.00%
crates/acp-nats/src/nats/subjects/global/providers_disable.rs                                 6       0  100.00%
crates/acp-nats/src/nats/subjects/global/ext_notify.rs                                        9       0  100.00%
crates/acp-nats/src/nats/subjects/global/session_list.rs                                      6       0  100.00%
crates/acp-nats/src/nats/subjects/global/authenticate.rs                                      6       0  100.00%
crates/acp-nats/src/nats/subjects/global/initialize.rs                                        6       0  100.00%
crates/acp-nats/src/nats/subjects/global/providers_set.rs                                     6       0  100.00%
crates/acp-nats/src/nats/subjects/global/ext.rs                                               9       0  100.00%
crates/acp-nats-agent/src/connection.rs                                                     482       1  99.79%   726
crates/trogon-std/src/time/system.rs                                                          9       0  100.00%
crates/trogon-std/src/time/mock.rs                                                           32       0  100.00%
crates/trogon-decider-wasm-runtime/src/opaque_snapshot.rs                                    18       0  100.00%
crates/trogon-decider-wasm-runtime/src/command_type.rs                                       31       0  100.00%
crates/trogon-decider-wasm-runtime/src/execution.rs                                         363       0  100.00%
crates/trogon-decider-wasm-runtime/src/test_fixture.rs                                        7       0  100.00%
crates/trogon-decider-wasm-runtime/src/domain_error_detail.rs                                 6       0  100.00%
crates/trogon-decider-wasm-runtime/src/module_version.rs                                     34       0  100.00%
crates/trogon-decider-wasm-runtime/src/registry.rs                                           28       0  100.00%
crates/trogon-decider-wasm-runtime/src/engine.rs                                             43       0  100.00%
crates/trogon-decider-wasm-runtime/src/module_name.rs                                        34       0  100.00%
crates/trogon-decider-wasm-runtime/src/module.rs                                             64       0  100.00%
crates/trogon-decider-wasm-runtime/src/snapshot_id.rs                                        15       0  100.00%
crates/trogon-decider-wasm-runtime/src/command_spec.rs                                       12       0  100.00%
crates/ard-registry/src/bin/ard-registry-demo/main.rs                                        64      20  68.75%   13-35
crates/trogon-aauth-verify/src/jwks_cache.rs                                                 39       0  100.00%
crates/trogon-aauth-verify/src/nats_pop.rs                                                  125       1  99.20%   337
crates/trogon-aauth-verify/src/replay.rs                                                     26       0  100.00%
crates/trogon-aauth-verify/src/mission.rs                                                    33       0  100.00%
crates/trogon-aauth-verify/src/time_source.rs                                                10       0  100.00%
crates/trogon-aauth-verify/src/jkt.rs                                                        33       0  100.00%
crates/trogon-aauth-verify/src/delegation.rs                                                 53       0  100.00%
crates/trogon-aauth-verify/src/token.rs                                                     184       1  99.46%   181
crates/trogon-aauth-verify/src/jwks_http.rs                                                 144       0  100.00%
crates/trogon-aauth-verify/src/upstream.rs                                                   20       0  100.00%
crates/trogon-aauth-verify/src/jwks.rs                                                       15       0  100.00%
crates/trogon-aauth-verify/src/test_support.rs                                               86       0  100.00%
crates/trogon-aauth-verify/src/http_pop.rs                                                  268       0  100.00%
crates/trogon-aauth-verify/src/challenge.rs                                                  77       0  100.00%
crates/trogon-identity-types/src/aauth/headers.rs                                            47       0  100.00%
crates/trogon-identity-types/src/aauth/mission.rs                                            33       0  100.00%
crates/trogon-identity-types/src/aauth/person_server.rs                                      23       0  100.00%
crates/trogon-identity-types/src/aauth/error.rs                                              14       0  100.00%
crates/trogon-identity-types/src/aauth/login.rs                                              78       0  100.00%
crates/trogon-identity-types/src/aauth/mod.rs                                                69       0  100.00%
crates/trogon-std/src/args.rs                                                                12       9  25.00%   11-28
crates/trogon-std/src/duration.rs                                                            15       0  100.00%
crates/trogon-std/src/http.rs                                                                 8       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/json.rs                                                                23       0  100.00%
crates/trogon-std/src/uuid.rs                                                                 3       0  100.00%
crates/trogon-nats/src/lease/nats_kv_lease_config.rs                                         26       0  100.00%
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/release.rs                                                       5       5  0.00%    8-12
crates/trogon-nats/src/lease/lease_bucket.rs                                                 19       0  100.00%
crates/trogon-nats/src/lease/lease_timing.rs                                                 15       0  100.00%
crates/trogon-nats/src/lease/provision.rs                                                    83      10  87.95%   82-92
crates/trogon-nats/src/lease/lease_key.rs                                                    19       0  100.00%
crates/trogon-nats/src/lease/ttl.rs                                                          27       0  100.00%
crates/trogon-nats/src/lease/mod.rs                                                         107      13  87.85%   113-126
crates/trogon-nats/src/lease/acquire.rs                                                       5       5  0.00%    9-14
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/processor/execution/checkpoints/codec/twin.rs                    96       0  100.00%
crates/trogon-decider-guest-macros/src/lib.rs                                               121      16  86.78%   14-19, 95-98, 413-422, 426
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/github/config.rs                                             9       0  100.00%
crates/a2a-gateway/src/runtime/env.rs                                                        55       0  100.00%
crates/a2a-gateway/src/runtime/reply.rs                                                       5       0  100.00%
crates/a2a-gateway/src/runtime/aauth_env.rs                                                 162       0  100.00%
crates/a2a-gateway/src/runtime/tier1_denial.rs                                               34       1  97.06%   60
crates/a2a-gateway/src/runtime/policy_stack.rs                                               78      31  60.26%   84, 91, 103-112, 119-120, 135-145, 154-170, 175
crates/a2a-gateway/src/runtime/streaming.rs                                                  35       0  100.00%
crates/a2a-gateway/src/runtime/audit_publish.rs                                              16       0  100.00%
crates/a2a-gateway/src/runtime/tier1.rs                                                      30       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/acp-nats/src/ext_method_name.rs                                                       18       0  100.00%
crates/acp-nats/src/config.rs                                                                84       0  100.00%
crates/acp-nats/src/in_flight_slot_guard.rs                                                   7       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/req_id.rs                                                                21       0  100.00%
crates/acp-nats/src/agent_handler.rs                                                         28       0  100.00%
crates/acp-nats/src/client_handler.rs                                                        22       0  100.00%
crates/acp-nats/src/client_proxy.rs                                                          67       1  98.51%   57
crates/acp-nats/src/acp_prefix.rs                                                            13       0  100.00%
crates/acp-nats/src/session_id.rs                                                            21       0  100.00%
crates/acp-nats/src/error.rs                                                                 31       0  100.00%
crates/acp-nats/src/wire.rs                                                                  80      14  82.50%   38, 46-60, 103
crates/trogon-telemetry/src/trace.rs                                                         15       1  93.33%   24
crates/trogon-telemetry/src/log.rs                                                           36       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/service_name.rs                                                  17       0  100.00%
crates/a2a-nats/src/nats/subjects/stream.rs                                                  50       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/elicitation_complete.rs                         12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_read_text_file.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_kill.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/terminal_create.rs                              12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/elicitation_create.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/terminal_release.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/terminal_output.rs                              12       0  100.00%
crates/a2a-auth-callout/src/credentials/api_key.rs                                           46       1  97.83%   33
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/oidc.rs                                             188       4  97.87%   212-215
crates/acp-nats/src/jetstream/ext_policy.rs                                                   3       0  100.00%
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/consumers.rs                                                   41       0  100.00%
crates/a2a-redaction/src/skill_id.rs                                                         26       0  100.00%
crates/a2a-redaction/src/wasm_bundle_path.rs                                                 18       0  100.00%
crates/a2a-redaction/src/a2a_method.rs                                                       41       0  100.00%
crates/a2a-redaction/src/redactor.rs                                                         32       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/tier3_sentinel.rs                                                   12       0  100.00%
crates/trogon-gateway/src/source/gitlab/server.rs                                            78       0  100.00%
crates/trogon-gateway/src/source/gitlab/gitlab_signing_token.rs                              30       0  100.00%
crates/trogon-gateway/src/source/gitlab/signature.rs                                         13       0  100.00%
crates/trogon-gateway/src/source/standard_webhooks.rs                                       138       0  100.00%
crates/trogon-gateway/src/source/notion/verification_token.rs                                46       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/a2a-nats/src/audit/task_lifecycle.rs                                                  17       0  100.00%
crates/a2a-nats/src/audit/envelope.rs                                                        57       0  100.00%
crates/a2a-nats/src/audit/emitter.rs                                                         58       0  100.00%
crates/mcp-nats-stdio/src/main.rs                                                            36       0  100.00%
crates/mcp-nats-stdio/src/config.rs                                                          26       0  100.00%
crates/trogon-identity-types/src/act_chain.rs                                                13       0  100.00%
crates/mcp-nats/src/mcp_peer_id.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/jsonrpc.rs                                                                5       0  100.00%
crates/mcp-nats/src/client.rs                                                                12       0  100.00%
crates/mcp-nats/src/mcp_prefix.rs                                                            15       0  100.00%
crates/mcp-nats/src/wire.rs                                                                  18       0  100.00%
crates/mcp-nats/src/config.rs                                                                59       0  100.00%
crates/mcp-nats/src/server.rs                                                                12       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/config.rs                                    70       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/client.rs                                    29      15  48.28%   43-69, 97-99, 108-117
crates/trogon-std/src/dirs/fixed.rs                                                          32       0  100.00%
crates/trogon-std/src/dirs/system.rs                                                         39       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/cancel.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/resubscribe.rs                                15       0  100.00%
crates/trogon-decider-sim/src/scenario.rs                                                   142       4  97.18%   152-154, 258
crates/trogon-decider-sim/src/host.rs                                                        35       0  100.00%
crates/trogon-decider-sim/src/fixture.rs                                                     18       2  88.89%   30-32
crates/trogon-decider-sim/src/import_check.rs                                                52       4  92.31%   68-70, 90
crates/trogon-decider-sim/src/session.rs                                                     15       0  100.00%
crates/acp-nats/src/telemetry/metrics.rs                                                     22       0  100.00%
crates/a2a-auth-callout/src/jwt/mod.rs                                                      232       0  100.00%
crates/a2a-auth-callout/src/jwt/nats_user_jwt.rs                                            187       1  99.47%   131
crates/a2a-auth-callout/src/jwt/user_jwt_subject.rs                                          12       0  100.00%
crates/a2a-auth-callout/src/jwt/nats_permission_claims.rs                                    10       0  100.00%
TOTAL                                                                                     37219    1546  95.85%

Diff against main

Filename                                                                Stmts    Miss  Cover
--------------------------------------------------------------------  -------  ------  --------
crates/acp-nats/src/agent/providers_list.rs                                +5       0  +100.00%
crates/acp-nats/src/agent/delete_session.rs                               +16       0  +100.00%
crates/acp-nats/src/agent/providers_disable.rs                             +5       0  +100.00%
crates/acp-nats/src/agent/bridge.rs                                       +14       0  +0.33%
crates/acp-nats/src/agent/providers_set.rs                                 +5       0  +100.00%
crates/acp-nats/src/nats/parsing.rs                                       +10     -15  +13.27%
crates/acp-nats-server/src/connection.rs                                  -12     -13  +9.13%
crates/acp-nats-server/src/transport.rs                                    -2      -6  +0.57%
crates/acp-nats/src/client/ext.rs                                          +5       0  +100.00%
crates/acp-nats/src/client/elicitation_complete.rs                         +8       0  +100.00%
crates/acp-nats/src/client/elicitation_create.rs                          +41       0  +100.00%
crates/acp-nats/src/client/session_update.rs                               +6       0  +100.00%
crates/acp-nats/src/boundary/abort_on_drop.rs                             +16       0  +100.00%
crates/acp-nats/src/boundary/connection_client.rs                         +29       0  +100.00%
crates/acp-nats/src/boundary/connect_agent_boundary.rs                   +199       0  +100.00%
crates/acp-nats/src/boundary/eof_signal_reader.rs                         +20       0  +100.00%
crates/acp-nats/src/nats/subjects/commands/delete.rs                      +15       0  +100.00%
crates/a2a-nats-stdio/src/dispatch.rs                                      +5       0  +0.09%
crates/acp-nats-stdio/src/main.rs                                          -2      -3  +4.68%
crates/acp-nats/src/nats/subjects/global/providers_list.rs                 +6       0  +100.00%
crates/acp-nats/src/nats/subjects/global/providers_disable.rs              +6       0  +100.00%
crates/acp-nats/src/nats/subjects/global/providers_set.rs                  +6       0  +100.00%
crates/acp-nats-agent/src/connection.rs                                   +14       0  +0.01%
crates/acp-nats/src/agent_handler.rs                                      +28       0  +100.00%
crates/acp-nats/src/client_handler.rs                                     +22       0  +100.00%
crates/acp-nats/src/client_proxy.rs                                        +4       0  +0.09%
crates/acp-nats/src/nats/subjects/client_ops/elicitation_complete.rs      +12       0  +100.00%
crates/acp-nats/src/nats/subjects/client_ops/elicitation_create.rs        +12       0  +100.00%
TOTAL                                                                    +493     -37  +0.15%

Results for commit: 270f941

Minimum allowed coverage is 95%

♻️ This comment has been updated with latest results

yordis added 2 commits July 8, 2026 17:47
The shutdown test asserted error display text, which the
error_string_comparison lint exists to forbid. The coverage gate
flagged the handler defaults, routing enums, and boundary adapters as
newly uncovered; exercising every routed method end to end also caught
a real defect: a spawned notification handler returning an error killed
the entire connection, so one unknown ext notification from a peer
could take the bridge down. Notification handlers now log and swallow.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
CI's coverage gate compares per-file missed counts against main, so
newly created files must arrive essentially fully covered. The last
uncovered boundary paths were the ext success response, the failing
notification handlers, and the non-ext enum fallthroughs, which needed
an agent stub that succeeds and fails in the opposite places from the
existing one.

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

🧹 Nitpick comments (6)
rsworkspace/crates/acp-nats/src/agent/prompt/tests.rs (1)

169-178: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider extracting the duplicated notification construction into a test helper.

Both prompt_js_notification_forwarding (lines 169–178) and prompt_js_notification_receiver_dropped (lines 451–460) build an identical SessionNotification with the same AgentThoughtChunkContentChunkTextContent::new("thinking...") structure. Extracting a small helper (e.g., fn make_thought_notification(session_id: &str) -> SessionNotification) would eliminate the duplication and keep future schema migrations to a single site.

Also applies to: 451-460

🤖 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/acp-nats/src/agent/prompt/tests.rs` around lines 169 -
178, The test setup duplicates the same SessionNotification construction in
prompt_js_notification_forwarding and prompt_js_notification_receiver_dropped;
extract that repeated
AgentThoughtChunk/ContentChunk/TextContent::new("thinking...") build into a
small helper such as make_thought_notification(session_id: &str) and update both
tests to use it. Keep the helper near the existing test utilities in tests.rs so
future schema changes only need one update.
rsworkspace/crates/acp-nats/src/boundary/connection_client.rs (1)

14-16: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

ext_method and ext_notification contain conversion logic, violating the zero-cost passthrough guideline.

The doc comment claims "Every method is a zero-cost passthrough," but ext_method (lines 66-75) and ext_notification (lines 77-81) perform wire-method construction (format!), UntypedMessage creation, error wrapping (map_err(Error::into_internal_error)), and return-type conversion (to_raw_valueExtResponse::new). The coding guideline requires production trait implementations to be pure passthroughs with conversion logic in the caller.

Consider either updating the doc to acknowledge the exception for ext methods, or adding raw untyped methods to ClientHandler (e.g., send_untyped_request/send_untyped_notification) so the conversion can live in client/ext.rs while ConnectionClient remains a thin wrapper.

As per coding guidelines: "Production implementations of infrastructure traits must be zero-cost passthroughs to the underlying SDK: no error wrapping, no return-type conversion, no map_err… any conversion logic belongs in the caller."

♻️ Proposed doc fix (minimal)
 /// See ADR 0020: this is the SDK-connection-aware boundary shared by
 /// `acp-nats-server` and `acp-nats-stdio`. Every method is a zero-cost
-/// passthrough to the connection's outbound request/notification calls.
+/// passthrough to the connection's outbound request/notification calls,
+/// except `ext_method`/`ext_notification` which adapt typed ext payloads
+/// to the SDK's `UntypedMessage` wire format.

Also applies to: 66-81

🤖 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/acp-nats/src/boundary/connection_client.rs` around lines
14 - 16, The `ConnectionClient` doc and its `ext_method`/`ext_notification`
implementations conflict with the zero-cost passthrough guideline because they
still do request formatting, `UntypedMessage` construction, error mapping, and
response conversion. Update `ConnectionClient` so it only forwards raw untyped
SDK calls by introducing or using raw methods on `ClientHandler` (such as
`send_untyped_request`/`send_untyped_notification`) and move all conversion
logic into `client/ext.rs`, or else revise the doc comment to explicitly call
out the exception for ext methods. Keep `ext_method` and `ext_notification` as
thin wrappers around the underlying handler.

Source: Coding guidelines

rsworkspace/crates/acp-nats/src/client_proxy/tests.rs (1)

167-180: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider verifying response content in the elicitation_create test.

The test asserts result.is_ok() but doesn't verify the deserialized response content, unlike neighboring tests (e.g., read_text_file_publishes_to_correct_subject checks result.unwrap().content). Adding a content assertion would catch deserialization regressions in the CreateElicitationResponse path.

🧪 Suggested assertion
     let result = p
         .elicitation_create(CreateElicitationRequest::new(mode, "please respond"))
         .await;
 
-    assert!(result.is_ok());
+    assert!(result.is_ok());
+    let response = result.unwrap();
+    assert!(response.action.is_accept());
🤖 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/acp-nats/src/client_proxy/tests.rs` around lines 167 -
180, The `elicitation_create_publishes_to_correct_subject` test only checks that
`elicitation_create` succeeds, so it misses deserialization regressions in
`CreateElicitationResponse`. Update this test to also inspect the returned value
from `p.elicitation_create(...)` and assert the expected response content,
following the pattern used by neighboring tests like
`read_text_file_publishes_to_correct_subject`. Use the existing
`elicitation_create`, `CreateElicitationResponse`, and `proxy` symbols to locate
the test and add the content assertion.
rsworkspace/crates/acp-nats/src/client/elicitation_complete.rs (1)

8-34: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

Consider recording metrics on client forwarding failure too.

Metrics are recorded only on decode failure (line 30); the client.elicitation_complete error path (line 25-27) only logs a warning without a corresponding metric. This asymmetry may leave client-side forwarding failures unobserved.

🤖 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/acp-nats/src/client/elicitation_complete.rs` around lines
8 - 34, The handle function in elicitation_complete.rs records metrics for
decode failures but not for client forwarding failures. Update the
client.elicitation_complete error branch inside handle so it also calls
metrics.record_error with an appropriate category/reason before logging the
warning, keeping the telemetry consistent with the decode_failure path. Use the
existing handle, client.elicitation_complete, and metrics.record_error symbols
to place the fix.
.github/workflows/acp-freshness.yml (2)

1-23: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low value

Consider adding concurrency control to prevent duplicate drift issues.

Without a concurrency block, a scheduled run and a manual workflow_dispatch could overlap. Both would find no existing drift issue (TOCTOU race) and each would create a separate issue.

♻️ Proposed addition
 on:
   schedule:
     # Weekly, Monday 09:00 UTC
     - cron: '0 9 * * 1'
   workflow_dispatch:
 
+concurrency:
+  group: acp-freshness
+  cancel-in-progress: true
+
 permissions:
🤖 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 @.github/workflows/acp-freshness.yml around lines 1 - 23, Add workflow
concurrency to the ACP Freshness GitHub Actions workflow so scheduled and manual
runs cannot overlap and create duplicate drift issues. Update the acp-freshness
workflow to include a concurrency block for the check job or workflow, using a
stable group name and cancel-in-progress behavior, so the existing check step
and drift issue creation run only once at a time.

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

Add persist-credentials: false to the checkout action.

The workflow uses GH_TOKEN from the environment for gh commands, so persisting the GitHub token in git config (the default behavior) is unnecessary and expands the credential exposure surface. This matches the zizmor artipacked warning.

🔒 Proposed fix
-      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+        with:
+          persist-credentials: false
🤖 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 @.github/workflows/acp-freshness.yml at line 17, Add persist-credentials:
false to the actions/checkout step in the ACP freshness workflow. Update the
checkout configuration in the workflow job that uses actions/checkout so it does
not write the default GitHub token into git config, since GH_TOKEN is already
used for gh commands; keep the change scoped to the checkout action and preserve
the rest of the workflow behavior.

Source: Linters/SAST tools

🤖 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 @.config/mise/tasks/acp-freshness:
- Around line 52-69: The heredoc in the drift issue body generation has
unescaped backticks that will be treated as command substitution, so the message
loses paths and filenames. Update the `cat >"$body_file" <<EOF` block to escape
every literal backtick consistently, matching the existing escaped entries, so
strings like `docs/architecture/acp-conformance.md`,
`acp-nats/src/nats/parsing.rs`, and `.github/workflows/acp-freshness.yml` are
preserved in the final body.

In `@docs/architecture/acp-conformance.md`:
- Around line 82-87: The ACP conformance table uses status labels like
“capabilities implemented” and “watch-only” that are not defined in the legend,
so update these rows to a documented legend value or extend the legend to
explicitly define the new statuses. Make the change in the architecture document
table entries for the relevant capability rows and ensure the legend and row
labels stay aligned with the existing status vocabulary used throughout the
document.
- Around line 40-42: Reclassify the providers rows in the conformance table so
the status reflects an SDK boundary limitation rather than missing routing:
`AgentHandler::list_providers`, `AgentHandler::set_provider`,
`AgentHandler::disable_provider`, and the NATS subjects (`providers.list`,
`providers.set`, `providers.disable`) are already implemented, but
`agent-client-protocol` 1.2.0 cannot represent these
`ClientRequest`/`JsonRpcRequest` variants. Update the `providers/list`,
`providers/set`, `providers/disable`, and payload-level Providers entries to use
`unrepresentable` (or split the upstream SDK note into a separate rationale) so
the label matches the actual blocker.

In `@rsworkspace/crates/acp-nats-server/src/connection.rs`:
- Around line 66-101: The cleanup in the `connect_agent_boundary` callback does
not run when EOF wins, so the spawned `client::run` task and notification
forwarder can survive past the WebSocket lifetime. Update the `connection.rs`
handler around `connect_agent_boundary`, `spawn_notification_forwarder`, and the
`tokio::task::spawn_local(client::run(...))` call to ensure both tasks are tied
to the callback’s lifetime, using an abort-on-drop guard or equivalent
cancellation wiring. Make sure the spawned client task is always aborted and
awaited when the boundary callback exits for any reason, not only in the current
shutdown branch.

In `@rsworkspace/crates/acp-nats/src/boundary/connect_agent_boundary.rs`:
- Around line 249-269: The connect_agent_boundary builder is missing the
AgentHandler provider RPC wiring, so list_providers, set_provider, and
disable_provider never get routed. Update connect_agent_boundary’s request
registration sequence alongside the existing route_request! calls for methods
like list_sessions and fork_session, and add route_request! entries for
AgentHandler’s list_providers, set_provider, and disable_provider so the bridge
exposes those provider operations.

In `@rsworkspace/crates/acp-nats/src/boundary/connect_agent_boundary/tests.rs`:
- Around line 188-300: Extend every_agent_method_is_routed_through_the_boundary
to include provider-related requests so the routing coverage matches the
boundary behavior. Add cases for providers/list, providers/set, and
providers/disable to the requests table using the corresponding request types
already used elsewhere in the test file, then update the expected results map
and assertions so these new ids are validated like the existing session and auth
methods. Use the request construction patterns in connect_agent_boundary::tests
and the method routing handled by ConnectAgentBoundary as the reference points.

In `@rsworkspace/crates/acp-nats/src/boundary/eof_signal_reader.rs`:
- Around line 29-37: The EOF signaling in eof_signal_reader::poll_read is
treating every Ok(0) as end-of-stream, which can wrongly fire on zero-length
reads. Update the poll_read logic to only send the signal when the buffer is
non-empty and the inner reader returns Ok(0) or an error, keeping the existing
signal.take() and send flow in place. Use the poll_read method and the signal
handling in EOFSignalReader as the target locations for this guard.

In `@rsworkspace/crates/acp-nats/src/client/elicitation_create.rs`:
- Around line 83-95: The request parsing in elicitation_create should preserve
the typed wire error and keep session validation separate. Update the
decode_request_params handling in ElicitationCreateRequest so InvalidRequest
carries the WireError directly instead of converting it through
serde_json::Error::custom, and introduce/use a dedicated error variant for the
scope.sessionId vs expected_session_id mismatch in the ElicitationCreateError
flow rather than fabricating a serde error for that validation failure.

In `@rsworkspace/crates/acp-nats/src/wire/tests.rs`:
- Around line 240-252: The test in
set_session_config_option_request_model_config_category_option_survives_round_trip
is asserting the local SessionConfigOption instead of anything produced by
encode_request/decode_request_params, so it does not verify a wire round-trip.
Update the test to assert only fields that actually exist on
SetSessionConfigOptionRequest after decoding (such as config_id and value), or
remove the category assertion entirely since SetSessionConfigOptionRequest has
no category field and that behavior is already covered by ConfigOptionUpdate.
- Around line 188-205: The round-trip test is using the wrong access pattern for
SessionInfoUpdate::title, since it is not an Option and cannot be taken. Update
session_update_session_info_update_survives_round_trip to inspect the decoded
SessionUpdate::SessionInfoUpdate value through the title accessor on
SessionInfoUpdate, and compare it directly against the expected "renamed
session" string. Keep the rest of the
encode_notification/decode_notification_params flow and the match on
SessionUpdate unchanged.

---

Nitpick comments:
In @.github/workflows/acp-freshness.yml:
- Around line 1-23: Add workflow concurrency to the ACP Freshness GitHub Actions
workflow so scheduled and manual runs cannot overlap and create duplicate drift
issues. Update the acp-freshness workflow to include a concurrency block for the
check job or workflow, using a stable group name and cancel-in-progress
behavior, so the existing check step and drift issue creation run only once at a
time.
- Line 17: Add persist-credentials: false to the actions/checkout step in the
ACP freshness workflow. Update the checkout configuration in the workflow job
that uses actions/checkout so it does not write the default GitHub token into
git config, since GH_TOKEN is already used for gh commands; keep the change
scoped to the checkout action and preserve the rest of the workflow behavior.

In `@rsworkspace/crates/acp-nats/src/agent/prompt/tests.rs`:
- Around line 169-178: The test setup duplicates the same SessionNotification
construction in prompt_js_notification_forwarding and
prompt_js_notification_receiver_dropped; extract that repeated
AgentThoughtChunk/ContentChunk/TextContent::new("thinking...") build into a
small helper such as make_thought_notification(session_id: &str) and update both
tests to use it. Keep the helper near the existing test utilities in tests.rs so
future schema changes only need one update.

In `@rsworkspace/crates/acp-nats/src/boundary/connection_client.rs`:
- Around line 14-16: The `ConnectionClient` doc and its
`ext_method`/`ext_notification` implementations conflict with the zero-cost
passthrough guideline because they still do request formatting, `UntypedMessage`
construction, error mapping, and response conversion. Update `ConnectionClient`
so it only forwards raw untyped SDK calls by introducing or using raw methods on
`ClientHandler` (such as `send_untyped_request`/`send_untyped_notification`) and
move all conversion logic into `client/ext.rs`, or else revise the doc comment
to explicitly call out the exception for ext methods. Keep `ext_method` and
`ext_notification` as thin wrappers around the underlying handler.

In `@rsworkspace/crates/acp-nats/src/client_proxy/tests.rs`:
- Around line 167-180: The `elicitation_create_publishes_to_correct_subject`
test only checks that `elicitation_create` succeeds, so it misses
deserialization regressions in `CreateElicitationResponse`. Update this test to
also inspect the returned value from `p.elicitation_create(...)` and assert the
expected response content, following the pattern used by neighboring tests like
`read_text_file_publishes_to_correct_subject`. Use the existing
`elicitation_create`, `CreateElicitationResponse`, and `proxy` symbols to locate
the test and add the content assertion.

In `@rsworkspace/crates/acp-nats/src/client/elicitation_complete.rs`:
- Around line 8-34: The handle function in elicitation_complete.rs records
metrics for decode failures but not for client forwarding failures. Update the
client.elicitation_complete error branch inside handle so it also calls
metrics.record_error with an appropriate category/reason before logging the
warning, keeping the telemetry consistent with the decode_failure path. Use the
existing handle, client.elicitation_complete, and metrics.record_error symbols
to place the fix.
🪄 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: 771cae0a-6898-4468-bd8f-3f004f129a72

📥 Commits

Reviewing files that changed from the base of the PR and between 27e2607 and f0cfb55.

⛔ Files ignored due to path filters (3)
  • rsworkspace/Cargo.lock is excluded by !**/*.lock
  • rsworkspace/crates/trogon-semconv/src/gen/attribute.rs is excluded by !**/gen/**
  • rsworkspace/crates/trogon-semconv/src/gen/span.rs is excluded by !**/gen/**
📒 Files selected for processing (129)
  • .config/mise/tasks/acp-freshness
  • .github/workflows/acp-freshness.yml
  • docs/.vitepress/config.mts
  • docs/adr/0020-acp-sdk-1x-boundary-and-bridge-traits.md
  • docs/adr/0021-typed-decode-over-passthrough-forwarding.md
  • docs/adr/index.md
  • docs/architecture/acp-conformance.md
  • otel/semconv/registry/acp.yaml
  • rsworkspace/Cargo.toml
  • rsworkspace/crates/AGENTS.md
  • rsworkspace/crates/acp-nats-agent/Cargo.toml
  • rsworkspace/crates/acp-nats-agent/src/connection.rs
  • rsworkspace/crates/acp-nats-agent/src/connection/tests.rs
  • rsworkspace/crates/acp-nats-server/src/connection.rs
  • rsworkspace/crates/acp-nats-server/src/connection/tests.rs
  • rsworkspace/crates/acp-nats-server/src/tests.rs
  • rsworkspace/crates/acp-nats-server/src/transport.rs
  • rsworkspace/crates/acp-nats-stdio/src/main.rs
  • rsworkspace/crates/acp-nats/Cargo.toml
  • rsworkspace/crates/acp-nats/src/agent/authenticate.rs
  • rsworkspace/crates/acp-nats/src/agent/authenticate/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/bridge.rs
  • rsworkspace/crates/acp-nats/src/agent/cancel.rs
  • rsworkspace/crates/acp-nats/src/agent/cancel/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/close_session.rs
  • rsworkspace/crates/acp-nats/src/agent/close_session/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/delete_session.rs
  • rsworkspace/crates/acp-nats/src/agent/delete_session/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/ext_method.rs
  • rsworkspace/crates/acp-nats/src/agent/ext_method/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/ext_notification.rs
  • rsworkspace/crates/acp-nats/src/agent/ext_notification/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/fork_session.rs
  • rsworkspace/crates/acp-nats/src/agent/fork_session/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/initialize.rs
  • rsworkspace/crates/acp-nats/src/agent/initialize/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/js_request/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/list_sessions.rs
  • rsworkspace/crates/acp-nats/src/agent/list_sessions/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/load_session.rs
  • rsworkspace/crates/acp-nats/src/agent/load_session/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/logout.rs
  • rsworkspace/crates/acp-nats/src/agent/logout/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/mod.rs
  • rsworkspace/crates/acp-nats/src/agent/new_session.rs
  • rsworkspace/crates/acp-nats/src/agent/new_session/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/prompt.rs
  • rsworkspace/crates/acp-nats/src/agent/prompt/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/providers_disable.rs
  • rsworkspace/crates/acp-nats/src/agent/providers_disable/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/providers_list.rs
  • rsworkspace/crates/acp-nats/src/agent/providers_list/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/providers_set.rs
  • rsworkspace/crates/acp-nats/src/agent/providers_set/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/resume_session.rs
  • rsworkspace/crates/acp-nats/src/agent/resume_session/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/set_session_config_option.rs
  • rsworkspace/crates/acp-nats/src/agent/set_session_config_option/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/set_session_mode.rs
  • rsworkspace/crates/acp-nats/src/agent/set_session_mode/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/set_session_model/tests.rs
  • rsworkspace/crates/acp-nats/src/agent/tests.rs
  • rsworkspace/crates/acp-nats/src/agent_handler.rs
  • rsworkspace/crates/acp-nats/src/agent_handler/tests.rs
  • rsworkspace/crates/acp-nats/src/boundary/boundary_exit.rs
  • rsworkspace/crates/acp-nats/src/boundary/connect_agent_boundary.rs
  • rsworkspace/crates/acp-nats/src/boundary/connect_agent_boundary/tests.rs
  • rsworkspace/crates/acp-nats/src/boundary/connection_client.rs
  • rsworkspace/crates/acp-nats/src/boundary/eof_signal_reader.rs
  • rsworkspace/crates/acp-nats/src/boundary/eof_signal_reader/tests.rs
  • rsworkspace/crates/acp-nats/src/boundary/mod.rs
  • rsworkspace/crates/acp-nats/src/client/elicitation_complete.rs
  • rsworkspace/crates/acp-nats/src/client/elicitation_complete/tests.rs
  • rsworkspace/crates/acp-nats/src/client/elicitation_create.rs
  • rsworkspace/crates/acp-nats/src/client/elicitation_create/tests.rs
  • rsworkspace/crates/acp-nats/src/client/ext.rs
  • rsworkspace/crates/acp-nats/src/client/ext/tests.rs
  • rsworkspace/crates/acp-nats/src/client/ext_session_prompt_response.rs
  • rsworkspace/crates/acp-nats/src/client/ext_session_prompt_response/tests.rs
  • rsworkspace/crates/acp-nats/src/client/fs_read_text_file.rs
  • rsworkspace/crates/acp-nats/src/client/fs_read_text_file/tests.rs
  • rsworkspace/crates/acp-nats/src/client/fs_write_text_file.rs
  • rsworkspace/crates/acp-nats/src/client/fs_write_text_file/tests.rs
  • rsworkspace/crates/acp-nats/src/client/mod.rs
  • rsworkspace/crates/acp-nats/src/client/request_permission.rs
  • rsworkspace/crates/acp-nats/src/client/request_permission/tests.rs
  • rsworkspace/crates/acp-nats/src/client/session_update.rs
  • rsworkspace/crates/acp-nats/src/client/session_update/tests.rs
  • rsworkspace/crates/acp-nats/src/client/terminal_create.rs
  • rsworkspace/crates/acp-nats/src/client/terminal_create/tests.rs
  • rsworkspace/crates/acp-nats/src/client/terminal_kill.rs
  • rsworkspace/crates/acp-nats/src/client/terminal_kill/tests.rs
  • rsworkspace/crates/acp-nats/src/client/terminal_output.rs
  • rsworkspace/crates/acp-nats/src/client/terminal_output/tests.rs
  • rsworkspace/crates/acp-nats/src/client/terminal_release.rs
  • rsworkspace/crates/acp-nats/src/client/terminal_release/tests.rs
  • rsworkspace/crates/acp-nats/src/client/terminal_wait_for_exit.rs
  • rsworkspace/crates/acp-nats/src/client/terminal_wait_for_exit/tests.rs
  • rsworkspace/crates/acp-nats/src/client/tests.rs
  • rsworkspace/crates/acp-nats/src/client_handler.rs
  • rsworkspace/crates/acp-nats/src/client_handler/tests.rs
  • rsworkspace/crates/acp-nats/src/client_proxy.rs
  • rsworkspace/crates/acp-nats/src/client_proxy/tests.rs
  • rsworkspace/crates/acp-nats/src/lib.rs
  • rsworkspace/crates/acp-nats/src/nats/extensions.rs
  • rsworkspace/crates/acp-nats/src/nats/parsing.rs
  • rsworkspace/crates/acp-nats/src/nats/parsing/tests.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/elicitation_complete.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/elicitation_create.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/mod.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/commands/delete.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/commands/mod.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/global/mod.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/global/providers_disable.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/global/providers_list.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/global/providers_set.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/stream.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/tests.rs
  • rsworkspace/crates/acp-nats/src/pending_prompt_waiters.rs
  • rsworkspace/crates/acp-nats/src/pending_prompt_waiters/tests.rs
  • rsworkspace/crates/acp-nats/src/session_id.rs
  • rsworkspace/crates/acp-nats/src/session_id/tests.rs
  • rsworkspace/crates/acp-nats/src/tests.rs
  • rsworkspace/crates/acp-nats/src/wire.rs
  • rsworkspace/crates/acp-nats/src/wire/tests.rs
  • rsworkspace/dylints/trogon_lints/src/function_local_macro_rules.rs
  • rsworkspace/dylints/trogon_lints/src/lib.rs
  • rsworkspace/dylints/trogon_lints/ui/function_local_macro_rules.rs
  • rsworkspace/dylints/trogon_lints/ui/function_local_macro_rules.stderr
💤 Files with no reviewable changes (1)
  • rsworkspace/crates/acp-nats/src/agent/set_session_model/tests.rs

Comment thread .config/mise/tasks/acp-freshness
Comment thread docs/architecture/acp-conformance.md Outdated
Comment thread docs/architecture/acp-conformance.md
Comment thread rsworkspace/crates/acp-nats-server/src/connection.rs
Comment thread rsworkspace/crates/acp-nats/src/boundary/connect_agent_boundary.rs
Comment thread rsworkspace/crates/acp-nats/src/boundary/eof_signal_reader.rs
Comment thread rsworkspace/crates/acp-nats/src/client/elicitation_create.rs
Comment thread rsworkspace/crates/acp-nats/src/wire/tests.rs
Comment thread rsworkspace/crates/acp-nats/src/wire/tests.rs Outdated
yordis added 7 commits July 8, 2026 18:20
The function_local_use policy lint applies to test targets, and the
coverage tests declared imports inside test bodies. Local verification
had skipped --all-targets, which is why this reached CI.

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

The elicitation handler laundered a typed WireError through a
fabricated serde error and did the same for session-scope validation,
against the typed-errors rule. The model_config request round-trip test
asserted a local variable rather than decoded data and duplicated the
boolean coverage; the real category round-trip lives in the
ConfigOptionUpdate test.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
A zero-length poll_read conventionally returns Ok(0) without meaning
end of stream, which would have torn the connection down as if the
peer disconnected.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
When EOF wins the boundary select, main_fn is dropped before its
cleanup block, so the client proxy loop and notification forwarder
outlived their WebSocket on the shared LocalSet. Both are now tied to
main_fn's lifetime with an abort-on-drop guard. The conformance matrix
also gains legend entries for its two informal statuses, and providers
move from unwired to unrepresentable since the blocker is the SDK's
missing request impls, not missing routing.

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

The lockfile refresh grew OutboundFrame past clippy's large-error
threshold in a crate this branch never touched. The boundary coverage
test sent mcp frames with wrong field names, so enum decoding failed
upstream and the catch-all fallthrough lines were never executed even
though the observable response looked identical.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
The mcp/connect frame is now built by serializing the schema type so
enum decoding cannot silently diverge, and both notification warn
paths funnel through one helper that a synchronous unit test covers,
removing the timing dependence that made per-run coverage flap.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
mcp/connect flows agent to client, so the client-to-agent request enum
never matched it and the role default answered with the same error the
assertion accepted. mcp/message is the one non-ext variant that can
reach the catch-all; verified per-line with llvm-cov that the branch
now executes.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
@yordis
yordis merged commit 0814798 into main Jul 9, 2026
10 checks passed
@yordis
yordis deleted the yordis/check-acp-protocol-version branch July 9, 2026 03:12
yordis added a commit that referenced this pull request Jul 28, 2026
…#477)

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
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.

ACP SDK migration: agent-client-protocol 0.10.4 to 1.2.x

1 participant