Skip to content

feat(rust): enforce error-string policy lint#378

Merged
yordis merged 1 commit into
mainfrom
yordis/feat-error-string-lint
Jun 21, 2026
Merged

feat(rust): enforce error-string policy lint#378
yordis merged 1 commit into
mainfrom
yordis/feat-error-string-lint

Conversation

@yordis

@yordis yordis commented Jun 21, 2026

Copy link
Copy Markdown
Member
  • Error-derived behavior should depend on typed variants or domain categories instead of display text.
  • Rust policy checks need compiler type information so wording changes cannot silently affect decisions.

@cursor

cursor Bot commented Jun 21, 2026

Copy link
Copy Markdown

PR Summary

Medium Risk
New mandatory CI gate and toolchain plumbing can break PRs if existing code matches the lint; the policy targets error-handling semantics but does not change production runtime paths beyond enforcement.

Overview
Adds a repo-owned Dylint crate (trogon_lints) with an error_string_comparison rule that rejects using std::error::Error display text (to_string and tracked aliases) for equality, substring probes, regex is_match, and similar control flow—using type information so only real Error receivers are flagged.

CI and local gates now install cargo-dylint / dylint-link, pin a separate nightly toolchain for building the lint plugin, run the lint crate’s UI tests, and execute cargo dylint with -Derror-string-comparison on the workspace (lib targets with --all-features) before Clippy. setup-rust always ensures rustfmt, clippy, and llvm-tools-preview; the lint job passes dylint-toolchain-dir. Root rust-toolchain.toml and mise Rust profile/components align with that setup; ci-rust also adds concurrency cancel-in-progress and triggers on rust-toolchain.toml.

A small scheduler test exercises default DeliveredMessage redelivery/delivery-count behavior only.

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

@coderabbitai

coderabbitai Bot commented Jun 21, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 5d0dc7aa-963c-439d-bce9-d0e24044aab3

📥 Commits

Reviewing files that changed from the base of the PR and between 7eed634 and 72d3417.

⛔ Files ignored due to path filters (1)
  • rsworkspace/dylints/trogon_lints/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (15)
  • .config/mise/tasks/rust-pr-check
  • .github/actions/setup-rust/action.yml
  • .github/workflows/ci-rust.yml
  • .mise.toml
  • rsworkspace/crates/trogon-scheduler/src/processor/execution/worker/dispatcher.rs
  • rsworkspace/dylints/trogon_lints/.cargo/config.toml
  • rsworkspace/dylints/trogon_lints/.gitignore
  • rsworkspace/dylints/trogon_lints/Cargo.toml
  • rsworkspace/dylints/trogon_lints/README.md
  • rsworkspace/dylints/trogon_lints/rust-toolchain.toml
  • rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs
  • rsworkspace/dylints/trogon_lints/src/lib.rs
  • rsworkspace/dylints/trogon_lints/ui/main.rs
  • rsworkspace/dylints/trogon_lints/ui/main.stderr
  • rust-toolchain.toml
✅ Files skipped from review due to trivial changes (8)
  • rsworkspace/dylints/trogon_lints/.gitignore
  • rsworkspace/dylints/trogon_lints/.cargo/config.toml
  • rust-toolchain.toml
  • rsworkspace/dylints/trogon_lints/README.md
  • .mise.toml
  • rsworkspace/dylints/trogon_lints/rust-toolchain.toml
  • rsworkspace/crates/trogon-scheduler/src/processor/execution/worker/dispatcher.rs
  • rsworkspace/dylints/trogon_lints/ui/main.stderr
🚧 Files skipped from review as they are similar to previous changes (6)
  • rsworkspace/dylints/trogon_lints/Cargo.toml
  • .config/mise/tasks/rust-pr-check
  • rsworkspace/dylints/trogon_lints/ui/main.rs
  • .github/workflows/ci-rust.yml
  • rsworkspace/dylints/trogon_lints/src/lib.rs
  • rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs

Walkthrough

Introduces a new trogon_lints Dylint crate with a single error_string_comparison late lint pass that tracks bindings of error.to_string() results and warns when those strings drive comparisons or string-search operations. The crate is scaffolded with its own nightly toolchain pin and wired into mise.toml, the setup-rust composite action, ci-rust.yml, and the rust-pr-check task gate.

Changes

trogon_lints Dylint crate and CI wiring

Layer / File(s) Summary
trogon_lints crate scaffold and toolchain
rsworkspace/dylints/trogon_lints/Cargo.toml, rsworkspace/dylints/trogon_lints/rust-toolchain.toml, rsworkspace/dylints/trogon_lints/.cargo/config.toml, rsworkspace/dylints/trogon_lints/.gitignore, rsworkspace/dylints/trogon_lints/README.md
New trogon_lints crate manifest (cdylib, strict deny-lints, clippy_utils/dylint_linting/dylint_testing deps), nightly-2026-04-16 toolchain pin with rustc-dev, rust-src, and llvm-tools-preview, dylint-link linker config, /target gitignore, and README.
Lint declaration and registration
rsworkspace/dylints/trogon_lints/src/lib.rs
Declares ERROR_STRING_COMPARISON lint at Warn severity via declare_lint!, registers it and a TrogonLints late pass via register_lints, delegates check_local/check_expr to ErrorStringComparison, and adds a dylint_testing::ui_test harness.
ErrorStringComparison lint implementation
rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs
Implements ErrorStringComparison with HashSet<HirId> tracking error-string bindings; check_local and check_expr entry points that bind/clear tracked locals and emit on ==/!=, string-probe method calls, and is_match; is_error_string inference via implements_trait on std::error::Error, forwarder methods, and wrapper/control-flow expressions; bind/clear pattern and place utilities for recursive destructuring; is_string_probe/is_string_forwarder name filters; and the span_lint_and_then emission helper.
UI test fixtures and stderr snapshot
rsworkspace/dylints/trogon_lints/ui/main.rs, rsworkspace/dylints/trogon_lints/ui/main.stderr
Adds DomainError/DomainValue types with Display/Error impls, probe functions exercising aliasing, tuple-destructuring, @-pattern, reassignment, and initializer-style forms that trigger the lint, assertion helpers for single-line/multi-line/chained patterns, and the expected 20-warning stderr snapshot.
Rust toolchain and mise configuration
rust-toolchain.toml, .mise.toml
Root rust-toolchain.toml pinned to 1.96.0 with minimal profile and explicit rustfmt, clippy, llvm-tools-preview components; .mise.toml Rust switched to minimal profile with explicit components and new pins for cargo-dylint and dylint-link.
setup-rust composite action updates
.github/actions/setup-rust/action.yml
Removes optional components input and unconditional user-provided component installation; adds unconditional Install Rust components step for rustfmt, clippy, llvm-tools-preview; adds conditional Install Dylint Rust components step driven by dylint-toolchain-dir input that parses rust-toolchain.toml, installs the nightly toolchain, and installs its required components.
ci-rust.yml workflow policy lint steps
.github/workflows/ci-rust.yml
Expands paths trigger to include rust-toolchain.toml; updates lint job to pass dylint-toolchain-dir: rsworkspace/dylints/trogon_lints to setup-rust and adds cargo test + cargo dylint steps for trogon_lints under its pinned nightly; removes components: llvm-tools-preview from test job setup-rust call.
rust-pr-check task policy lint gate
.config/mise/tasks/rust-pr-check
Inserts new "repo-owned policy lints" stage before clippy: derives and installs the pinned nightly toolchain from trogon_lints/rust-toolchain.toml, runs cargo test in that directory, then runs cargo dylint for the workspace with --no-deps and all features; reorders and renumbers subsequent clippy, unit-test, doc-test, and coverage gates.

Sequence Diagram(s)

sequenceDiagram
  participant CI as ci-rust workflow
  participant SetupRust as setup-rust action
  participant Nightly as Install nightly<br/>for trogon_lints
  participant TrogonTest as cargo test<br/>(trogon_lints)
  participant TrogonDylint as cargo dylint<br/>(workspace)
  participant Clippy as cargo clippy
  CI->>SetupRust: install stable Rust toolchain
  SetupRust->>CI: rustup component add rustfmt,clippy,llvm-tools-preview
  CI->>Nightly: detect trogon_lints/rust-toolchain.toml, parse nightly-2026-04-16
  Nightly->>CI: rustup toolchain install nightly-2026-04-16 with rustc-dev,rust-src,llvm-tools-preview
  CI->>TrogonTest: cargo test (under RUSTUP_TOOLCHAIN override)
  CI->>TrogonDylint: cargo dylint --workspace --no-deps --all-features (RUSTUP_TOOLCHAIN unset, DYLINT_RUSTFLAGS=-Derror-string-comparison)
  CI->>Clippy: cargo clean -p CRATE && cargo clippy
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐇 A lint hops into the codebase today,
Sniffing for strings where typed errors should stay.
error.to_string() in a match? Oh no!
The rabbit says "use typed variants, let error strings go!"
With dylint and HIR, the warren stays clean,
The strictest of bunnies you ever have seen. 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 8.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: introducing a Rust lint policy that enforces rules about error-string comparisons.
Description check ✅ Passed The description is directly related to the changeset, explaining the policy motivation: error-derived behavior should use typed variants rather than display text.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch yordis/feat-error-string-lint

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 and usage tips.

Comment thread rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs
@github-actions

github-actions Bot commented Jun 21, 2026

Copy link
Copy Markdown

badge

Code Coverage Summary

Details
Filename                                                                                  Stmts    Miss  Cover    Missing
--------------------------------------------------------------------------------------  -------  ------  -------  ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
crates/trogon-scheduler/src/processor/execution/reconciliation/recorded_events.rs           690      16  97.68%   200-205, 242, 250, 271, 291, 297, 303, 336, 346, 364, 448, 533, 541, 818, 1034
crates/trogon-scheduler/src/processor/execution/reconciliation/rrule_wakeup_payload.rs       35       0  100.00%
crates/trogon-scheduler/src/processor/execution/reconciliation/schedule_key.rs               67       0  100.00%
crates/trogon-scheduler/src/processor/execution/reconciliation/schedule_subject.rs           59       3  94.92%   60-62
crates/trogon-scheduler/src/processor/execution/reconciliation/reconcile.rs                 808      13  98.39%   251-260, 325-327
crates/trogon-scheduler/src/processor/execution/reconciliation/go_duration.rs                59       0  100.00%
crates/trogon-scheduler/src/processor/execution/reconciliation/request.rs                   542       2  99.63%   285, 290
crates/a2a-auth-callout/src/wire/bridge_adapter.rs                                           73      20  72.60%   30-55, 58
crates/a2a-auth-callout/src/wire/server_auth_request_claims.rs                              100      17  83.00%   24-26, 36-38, 120, 123-127, 141-146
crates/a2a-auth-callout/src/wire/test_encode.rs                                              59       0  100.00%
crates/a2a-auth-callout/src/wire/callout_auth_response_claims.rs                             94      23  75.53%   49-74
crates/a2a-auth-callout/src/wire/nkey_seed.rs                                                61       0  100.00%
crates/a2a-auth-callout/src/wire/nkey_public.rs                                             106      11  89.62%   47, 71-73, 87-90, 102, 118-119
crates/a2a-auth-callout/src/wire/wire_codec.rs                                               58      58  0.00%    19-92
crates/a2a-auth-callout/src/wire/server_auth_request_envelope.rs                            108      29  73.15%   16-18, 29-33, 38-39, 41-44, 64, 77-94
crates/a2a-auth-callout/src/wire/xkey_public.rs                                              51       0  100.00%
crates/trogon-decider-nats/src/snapshot_store.rs                                            861      27  96.86%   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/stream_store.rs                                              659      18  97.27%   70-72, 245, 273-274, 277, 293-297, 464-465, 506, 519-523
crates/trogon-decider-nats/src/store.rs                                                     128      45  64.84%   50-54, 101-167
crates/trogon-decider/src/lib.rs                                                            138       0  100.00%
crates/trogon-decider/src/act.rs                                                             62       0  100.00%
crates/trogon-decider/src/decision.rs                                                        27       0  100.00%
crates/trogon-decider/src/events.rs                                                          49       0  100.00%
crates/trogon-decider/src/testing.rs                                                        675       0  100.00%
crates/trogon-telemetry/src/trace.rs                                                         23       1  95.65%   24
crates/trogon-telemetry/src/log.rs                                                           70       1  98.57%   35
crates/trogon-telemetry/src/lib.rs                                                          208      24  88.46%   56, 120, 125, 130, 140-141, 147-165, 201, 204, 207, 213
crates/trogon-telemetry/src/resource_attribute.rs                                            23       0  100.00%
crates/trogon-telemetry/src/service_name.rs                                                  44       0  100.00%
crates/trogon-telemetry/src/metric.rs                                                        26       1  96.15%   30
crates/a2a-bridge/src/error.rs                                                               37      15  59.46%   26-31, 33-40, 48
crates/a2a-bridge/src/identity.rs                                                            88      32  63.64%   13-19, 43-45, 86-92, 144-169
crates/a2a-nats/src/catalog/import_gate/spicedb/config.rs                                    70       0  100.00%
crates/a2a-nats/src/catalog/import_gate/spicedb/mod.rs                                      107       0  100.00%
crates/a2a-nats/src/catalog/import_gate/spicedb/cache.rs                                     36       0  100.00%
crates/a2a-pack/src/agent_card_schema.rs                                                     81       0  100.00%
crates/a2a-pack/src/agent_card_read.rs                                                       66       0  100.00%
crates/acp-nats-stdio/src/config.rs                                                          66       0  100.00%
crates/acp-nats-stdio/src/main.rs                                                           135      25  81.48%   67, 115-122, 128-130, 147, 176-195
crates/mcp-nats/src/nats/parsing.rs                                                         191       0  100.00%
crates/mcp-nats/src/nats/mod.rs                                                              99       0  100.00%
crates/trogon-gateway/src/source/standard_webhooks.rs                                       138       0  100.00%
crates/acp-nats/src/nats/subjects/global/authenticate.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/initialize.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/session_new.rs                                       6       0  100.00%
crates/acp-nats/src/nats/subjects/global/ext.rs                                               9       0  100.00%
crates/trogon-decider-runtime/src/event/codec/event_decode.rs                                29       0  100.00%
crates/trogon-decider-runtime/src/event/codec/event_payload_error.rs                         25       0  100.00%
crates/trogon-decider-runtime/src/snapshot/snapshot_type.rs                                  73       0  100.00%
crates/trogon-decider-runtime/src/snapshot/mod.rs                                             3       0  100.00%
crates/trogon-decider-runtime/src/snapshot/read_snapshot.rs                                  11       0  100.00%
crates/trogon-gateway/src/source/incidentio/incidentio_event_type.rs                         62       0  100.00%
crates/trogon-gateway/src/source/incidentio/incidentio_signing_secret.rs                     56       0  100.00%
crates/trogon-gateway/src/source/incidentio/server.rs                                       343       0  100.00%
crates/trogon-gateway/src/source/incidentio/signature.rs                                    206       0  100.00%
crates/trogon-gateway/src/source/incidentio/config.rs                                        16       0  100.00%
crates/trogon-gateway/src/source/microsoft_graph/client_state.rs                             30       0  100.00%
crates/trogon-gateway/src/source/microsoft_graph/server.rs                                  325       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/push/set.rs                                         20       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/push/list.rs                                        23       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/push/get.rs                                         20       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/push/delete.rs                                      23       0  100.00%
crates/trogon-gateway/src/source/telegram/server.rs                                         339       0  100.00%
crates/trogon-gateway/src/source/telegram/config.rs                                          89       0  100.00%
crates/trogon-gateway/src/source/telegram/signature.rs                                       27       0  100.00%
crates/trogon-gateway/src/source/telegram/registration.rs                                   313       0  100.00%
crates/trogon-nats/src/jetstream/publish.rs                                                  64       0  100.00%
crates/trogon-nats/src/jetstream/claim_check.rs                                             393      10  97.46%   45-47, 99-105
crates/trogon-nats/src/jetstream/create_conflicts.rs                                         24       0  100.00%
crates/trogon-nats/src/jetstream/stream_max_age.rs                                           18       0  100.00%
crates/trogon-nats/src/jetstream/traits.rs                                                   46      40  13.04%   181-251
crates/trogon-nats/src/jetstream/mocks.rs                                                  1686       1  99.94%   505
crates/mcp-nats-server/src/main.rs                                                          357     127  64.43%   151-168, 204-206, 216, 222-223, 230-233, 257-259, 263-272, 294-307, 312-360, 491, 494, 502-544
crates/mcp-nats-server/src/config.rs                                                        257       0  100.00%
crates/mcp-nats-server/src/allowed_host.rs                                                   88       0  100.00%
crates/trogon-gateway/src/source/twitter/config.rs                                           17       0  100.00%
crates/trogon-gateway/src/source/twitter/server.rs                                          524       0  100.00%
crates/trogon-gateway/src/source/twitter/signature.rs                                        58       0  100.00%
crates/trogon-std/src/env/system.rs                                                          17       0  100.00%
crates/trogon-std/src/env/in_memory.rs                                                       73       0  100.00%
crates/trogon-std/src/telemetry/http.rs                                                     217       0  100.00%
crates/acp-nats/src/nats/subjects/responses/response.rs                                      20       0  100.00%
crates/acp-nats/src/nats/subjects/responses/update.rs                                        27       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                               27       0  100.00%
crates/mcp-nats/src/nats/subjects/mod.rs                                                     89       0  100.00%
crates/mcp-nats/src/nats/subjects/subscriptions/one_server.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/all_client.rs                                 6       0  100.00%
crates/mcp-nats/src/nats/subjects/subscriptions/one_client.rs                                 9       0  100.00%
crates/trogon-decider-runtime/src/execution.rs                                             1432       0  100.00%
crates/trogon-gateway/src/source/notion/server.rs                                           310       4  98.71%   115-116, 135-136
crates/trogon-gateway/src/source/notion/verification_token.rs                               220       0  100.00%
crates/trogon-gateway/src/source/notion/notion_verification_token.rs                         17       0  100.00%
crates/trogon-gateway/src/source/notion/notion_event_type.rs                                 46       3  93.48%   50-52
crates/trogon-gateway/src/source/notion/signature.rs                                         45       0  100.00%
crates/a2a-nats/src/push/delivery_semantics.rs                                              274       0  100.00%
crates/a2a-nats/src/push/target.rs                                                           54       0  100.00%
crates/a2a-nats/src/push/authentication_header.rs                                           104       0  100.00%
crates/a2a-nats/src/push/dispatch_error.rs                                                  111       0  100.00%
crates/a2a-nats/src/push/status_transition_id.rs                                             30       0  100.00%
crates/a2a-nats/src/push/terminal_push_task_state.rs                                         64       0  100.00%
crates/a2a-nats/src/push/idempotency_key_header.rs                                           43       0  100.00%
crates/a2a-nats/src/push/dlq.rs                                                             283       0  100.00%
crates/a2a-nats/src/push/push_delivery_semantics_registry.rs                                 57       0  100.00%
crates/a2a-nats/src/push/push_notification_target.rs                                        108       0  100.00%
crates/a2a-nats/src/push/push_notification_config.rs                                         20       0  100.00%
crates/a2a-nats/src/push/nats_push_subject.rs                                                34       0  100.00%
crates/a2a-nats/src/push/caller_id.rs                                                        91       0  100.00%
crates/a2a-nats/src/push/dlq_dedup.rs                                                       120       0  100.00%
crates/a2a-nats/src/push/push_payload.rs                                                     88       0  100.00%
crates/a2a-nats/src/push/push_idempotency_key.rs                                             84       0  100.00%
crates/a2a-nats/src/push/push_notification_config_id.rs                                      41       0  100.00%
crates/acp-nats/src/nats/mod.rs                                                              23       0  100.00%
crates/acp-nats/src/nats/extensions.rs                                                        3       0  100.00%
crates/acp-nats/src/nats/parsing.rs                                                         278       1  99.64%   151
crates/trogon-scheduler/src/processor/execution/worker/consumer.rs                          203       0  100.00%
crates/trogon-scheduler/src/processor/execution/worker/processor.rs                        1356      12  99.12%   279, 339, 437-438, 444, 499-501, 533-536
crates/trogon-scheduler/src/processor/execution/worker/dispatcher.rs                       1112       1  99.91%   200
crates/trogon-scheduler/src/processor/execution/worker/testkit.rs                           330       4  98.79%   459, 490-491, 496
crates/a2a-nats/src/nats/subjects/agents/tasks/resubscribe.rs                                23       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/tasks/list.rs                                       23       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/tasks/get.rs                                        23       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/tasks/cancel.rs                                     23       0  100.00%
crates/a2a-nats/src/nats/subjects/stream.rs                                                  54       0  100.00%
crates/a2a-nats/src/jetstream/streams.rs                                                     73       0  100.00%
crates/a2a-nats/src/jetstream/provision.rs                                                   62       0  100.00%
crates/a2a-nats/src/jetstream/stream_options.rs                                             114       0  100.00%
crates/a2a-nats/src/jetstream/consumers.rs                                                  112       0  100.00%
crates/a2a-nats/src/nats/subjects/subscriptions/agent_all.rs                                 20       0  100.00%
crates/a2a-nats/src/nats/subjects/subscriptions/task_all_events.rs                           17       0  100.00%
crates/a2a-nats/src/nats/subjects/subscriptions/task_one_events.rs                           20       0  100.00%
crates/acp-nats/src/acp_prefix.rs                                                            46       0  100.00%
crates/acp-nats/src/config.rs                                                               203       0  100.00%
crates/acp-nats/src/req_id.rs                                                                39       0  100.00%
crates/acp-nats/src/error.rs                                                                 82       0  100.00%
crates/acp-nats/src/session_id.rs                                                            68       0  100.00%
crates/acp-nats/src/client_proxy.rs                                                         181       0  100.00%
crates/acp-nats/src/in_flight_slot_guard.rs                                                  32       0  100.00%
crates/acp-nats/src/ext_method_name.rs                                                       65       0  100.00%
crates/acp-nats/src/lib.rs                                                                   69       0  100.00%
crates/acp-nats/src/jsonrpc.rs                                                                6       0  100.00%
crates/acp-nats/src/pending_prompt_waiters.rs                                               131       0  100.00%
crates/a2a-auth-callout/src/signing_key_source/key_version.rs                                20       8  60.00%   15-19, 28, 39-41
crates/a2a-auth-callout/src/signing_key_source/signing_key_handle.rs                         15       6  60.00%   15-20
crates/a2a-auth-callout/src/signing_key_source/loader.rs                                     18      18  0.00%    7-35
crates/a2a-auth-callout/src/signing_key_source/minting_material.rs                           18       6  66.67%   31-36
crates/a2a-auth-callout/src/signing_key_source/env.rs                                        38       4  89.47%   58, 75-77
crates/a2a-auth-callout/src/signing_key_source/static_source.rs                              25       0  100.00%
crates/a2a-auth-callout/src/signing_key_source/file.rs                                       38       6  84.21%   40-42, 61-63
crates/a2a-auth-callout/src/signing_key_source/vault.rs                                       3       0  100.00%
crates/acp-nats/src/client/fs_write_text_file.rs                                            408       0  100.00%
crates/acp-nats/src/client/rpc_reply.rs                                                      64       0  100.00%
crates/acp-nats/src/client/session_update.rs                                                 55       0  100.00%
crates/acp-nats/src/client/request_permission.rs                                            298       0  100.00%
crates/acp-nats/src/client/terminal_kill.rs                                                 278       0  100.00%
crates/acp-nats/src/client/terminal_release.rs                                              335       0  100.00%
crates/acp-nats/src/client/mod.rs                                                          2851       0  100.00%
crates/acp-nats/src/client/ext_session_prompt_response.rs                                   135       0  100.00%
crates/acp-nats/src/client/terminal_wait_for_exit.rs                                        364       0  100.00%
crates/acp-nats/src/client/terminal_create.rs                                               264       0  100.00%
crates/acp-nats/src/client/terminal_output.rs                                               206       0  100.00%
crates/acp-nats/src/client/fs_read_text_file.rs                                             346       0  100.00%
crates/acp-nats/src/client/ext.rs                                                           296       8  97.30%   146-155, 172-181
crates/trogon-std/src/time/system.rs                                                         31       0  100.00%
crates/trogon-std/src/time/mock.rs                                                          125       0  100.00%
crates/trogon-nats/src/nats_token.rs                                                        157       0  100.00%
crates/trogon-nats/src/connect.rs                                                            82       6  92.68%   41-46
crates/trogon-nats/src/auth.rs                                                              114       0  100.00%
crates/trogon-nats/src/messaging.rs                                                         534       2  99.63%   144, 154
crates/trogon-nats/src/server_info.rs                                                        76       3  96.05%   19-21
crates/trogon-nats/src/subject_token_violation.rs                                            11       0  100.00%
crates/trogon-nats/src/client.rs                                                             22      22  0.00%    50-86
crates/trogon-nats/src/mocks.rs                                                             314       0  100.00%
crates/trogon-nats/src/token.rs                                                               6       0  100.00%
crates/acp-nats-server/src/acp_connection_id.rs                                              37       0  100.00%
crates/acp-nats-server/src/config.rs                                                        126       3  97.62%   41-43
crates/acp-nats-server/src/main.rs                                                          900      10  98.89%   109, 243-250, 450
crates/acp-nats-server/src/connection.rs                                                    182      36  80.22%   95-102, 107-122, 138, 140-141, 146, 155-156, 161, 165, 169, 172, 180, 184, 187, 190-194, 232
crates/acp-nats-server/src/transport.rs                                                    1915     106  94.46%   253, 512, 530, 557, 611, 616, 636, 648, 767, 790-792, 844, 861-864, 960-963, 1038, 1041, 1044, 1053, 1057, 1060, 1063-1066, 1085, 1118-1121, 1129-1134, 1146-1150, 1154-1163, 1175-1176, 1194-1195, 1205, 1221-1225, 1253-1259, 1279-1281, 1286-1290, 1293-1298, 1315, 1317-1318, 1400-1401, 1413-1414, 1434-1435, 1487-1503, 2208, 2252, 2305, 2361, 2374
crates/trogon-gateway/src/config.rs                                                        2588      42  98.38%   81, 665, 668, 828, 885, 968, 971, 974, 978, 1062-1069, 1146, 1149, 1152, 1157, 1215, 1218, 1221, 1300, 1303, 1306, 1310, 1374, 1377, 1380, 1443, 1446, 1449, 1454, 1529, 1532, 1535, 1540, 1598, 1601, 1604, 1817-1819
crates/trogon-gateway/src/main.rs                                                           111       0  100.00%
crates/trogon-gateway/src/streams.rs                                                        129       0  100.00%
crates/trogon-gateway/src/source_integration_id.rs                                           55       2  96.36%   58, 60
crates/trogon-gateway/src/source_plugin.rs                                                  268       3  98.88%   82, 139-140
crates/trogon-gateway/src/http.rs                                                           145       0  100.00%
crates/trogon-gateway/src/source_status.rs                                                   24       0  100.00%
crates/acp-nats/src/telemetry/metrics.rs                                                     53       0  100.00%
crates/a2a-nats/src/push/dispatcher/http.rs                                                 141       0  100.00%
crates/a2a-nats/src/push/dispatcher/composite.rs                                            154       0  100.00%
crates/a2a-nats/src/push/dispatcher/mod.rs                                                   88       0  100.00%
crates/a2a-nats/src/push/dispatcher/jetstream.rs                                            226       0  100.00%
crates/a2a-nats/src/push/dispatcher/nats.rs                                                 183       0  100.00%
crates/a2a-nats/src/jsonrpc.rs                                                               49       0  100.00%
crates/a2a-nats/src/task_id.rs                                                               54       1  98.15%   25
crates/a2a-nats/src/constants.rs                                                             36       0  100.00%
crates/a2a-nats/src/a2a_prefix.rs                                                            44       0  100.00%
crates/a2a-nats/src/gateway_ingress.rs                                                      243       0  100.00%
crates/a2a-nats/src/agent_id.rs                                                              58       0  100.00%
crates/a2a-nats/src/context_id.rs                                                            51       1  98.04%   26
crates/a2a-nats/src/config.rs                                                               318       0  100.00%
crates/a2a-nats/src/req_id.rs                                                                41       0  100.00%
crates/a2a-nats/src/error.rs                                                                 32       0  100.00%
crates/a2a-nats/src/audit/task_lifecycle.rs                                                  17       0  100.00%
crates/a2a-nats/src/audit/envelope.rs                                                       204       0  100.00%
crates/a2a-nats/src/audit/emitter.rs                                                        160       0  100.00%
crates/a2a-identity-types/src/error.rs                                                       20       0  100.00%
crates/a2a-identity-types/src/jwt.rs                                                        156       0  100.00%
crates/a2a-identity-types/src/caller.rs                                                      61       0  100.00%
crates/a2a-identity-types/src/principal.rs                                                   40       0  100.00%
crates/trogon-gateway/src/source/gitlab/server.rs                                           460       0  100.00%
crates/trogon-gateway/src/source/gitlab/signature.rs                                        165       0  100.00%
crates/trogon-gateway/src/source/gitlab/gitlab_signing_token.rs                              62       0  100.00%
crates/trogon-gateway/src/source/sentry/server.rs                                           308       0  100.00%
crates/trogon-gateway/src/source/sentry/signature.rs                                         42       0  100.00%
crates/trogon-gateway/src/source/sentry/sentry_client_secret.rs                              17       0  100.00%
crates/trogon-scheduler/src/commands/remove_schedule.rs                                     171       0  100.00%
crates/trogon-scheduler/src/commands/create_schedule.rs                                     199       0  100.00%
crates/trogon-scheduler/src/commands/state.rs                                               472       0  100.00%
crates/trogon-scheduler/src/commands/schedule_next_occurrence.rs                            355       0  100.00%
crates/trogon-scheduler/src/commands/record_schedule_occurrence.rs                          348       1  99.71%   182
crates/trogon-scheduler/src/commands/snapshot.rs                                              4       0  100.00%
crates/trogon-scheduler/src/commands/resume_schedule.rs                                     207       0  100.00%
crates/trogon-scheduler/src/commands/pause_schedule.rs                                      174       0  100.00%
crates/trogon-gateway/src/source/discord/config.rs                                          105       0  100.00%
crates/trogon-gateway/src/source/discord/gateway.rs                                         426       1  99.77%   137
crates/a2a-nats/src/client/resubscribe.rs                                                    69       0  100.00%
crates/a2a-nats/src/client/wire.rs                                                           38       0  100.00%
crates/a2a-nats/src/client/gateway_headers.rs                                                68       0  100.00%
crates/a2a-nats/src/client/error.rs                                                         161       2  98.76%   135, 144
crates/a2a-nats/src/client/handle.rs                                                        934       0  100.00%
crates/a2a-nats/src/client/unary.rs                                                         187       0  100.00%
crates/a2a-nats/src/client/event_stream.rs                                                  247       0  100.00%
crates/a2a-nats/src/client/streaming.rs                                                     236       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_config_option.rs                              15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_mode.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/fork.rs                                           15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_model.rs                                      15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/load.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/prompt.rs                                         15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/close.rs                                          15       0  100.00%
crates/trogon-nats/src/telemetry/messaging.rs                                                82       0  100.00%
crates/trogonai-proto/src/convert.rs                                                        120       0  100.00%
crates/trogonai-proto/src/codec.rs                                                           16       0  100.00%
crates/a2a-nats/src/server/push_set.rs                                                       99       0  100.00%
crates/a2a-nats/src/server/tasks_resubscribe.rs                                             103       0  100.00%
crates/a2a-nats/src/server/handler.rs                                                        70       0  100.00%
crates/a2a-nats/src/server/agent_card.rs                                                    191       0  100.00%
crates/a2a-nats/src/server/bridge.rs                                                        282       0  100.00%
crates/a2a-nats/src/server/push_delete.rs                                                    97       0  100.00%
crates/a2a-nats/src/server/message_send.rs                                                  114       0  100.00%
crates/a2a-nats/src/server/tasks_get.rs                                                     103       0  100.00%
crates/a2a-nats/src/server/push_get.rs                                                      106       0  100.00%
crates/a2a-nats/src/server/tasks_list.rs                                                     97       0  100.00%
crates/a2a-nats/src/server/message_stream.rs                                                265       0  100.00%
crates/a2a-nats/src/server/test_support.rs                                                   41       0  100.00%
crates/a2a-nats/src/server/wire.rs                                                          120       0  100.00%
crates/a2a-nats/src/server/tasks_cancel.rs                                                  103       0  100.00%
crates/a2a-nats/src/server/dispatch.rs                                                      113       0  100.00%
crates/a2a-nats/src/server/push_list.rs                                                     104       0  100.00%
crates/trogon-scheduler/src/processor/execution/checkpoints/failure.rs                       38       0  100.00%
crates/trogon-scheduler/src/processor/execution/checkpoints/record.rs                         6       0  100.00%
crates/trogon-scheduler/src/processor/execution/checkpoints/store.rs                        407      17  95.82%   102, 120, 124, 132, 224-230, 236, 279-283
crates/trogon-scheduler/src/processor/execution/checkpoints/codec.rs                        641      68  89.39%   134, 140, 149, 192, 208-210, 227, 244-246, 415, 417-419, 453-464, 480-481, 486-487, 493-494, 507-508, 513-514, 519-523, 529-530, 545-546, 551-552, 558-559, 566-567, 572-573, 585-589, 595-597, 612-618, 626, 631-633, 643, 648
crates/a2a-nats-server/src/main.rs                                                            4       0  100.00%
crates/a2a-nats-server/src/runtime.rs                                                        98       0  100.00%
crates/a2a-nats-server/src/noop_handler.rs                                                  183       0  100.00%
crates/acp-nats/src/jetstream/consumers.rs                                                   91       0  100.00%
crates/acp-nats/src/jetstream/ext_policy.rs                                                  26       0  100.00%
crates/acp-nats/src/jetstream/provision.rs                                                   52       0  100.00%
crates/acp-nats/src/jetstream/streams.rs                                                    163       4  97.55%   206-208, 218
crates/a2a-nats-http/src/handlers/mod.rs                                                    185      68  63.24%   52-57, 64, 68, 74, 88-91, 95, 111, 115, 121, 125, 143-176, 182, 185, 190-196, 200-206, 210-216, 220-221
crates/mcp-nats/src/jsonrpc.rs                                                               22       0  100.00%
crates/mcp-nats/src/mcp_peer_id.rs                                                           31       0  100.00%
crates/mcp-nats/src/config.rs                                                               110       0  100.00%
crates/mcp-nats/src/server.rs                                                                31       0  100.00%
crates/mcp-nats/src/transport.rs                                                            698       0  100.00%
crates/mcp-nats/src/client.rs                                                                31       0  100.00%
crates/mcp-nats/src/mcp_prefix.rs                                                            34       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/message_send.rs                                     23       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/card.rs                                             20       0  100.00%
crates/a2a-nats/src/nats/subjects/agents/message_stream.rs                                   23       0  100.00%
crates/a2a-nats/src/nats/subjects/tasks/events.rs                                            31       0  100.00%
crates/mcp-nats/src/telemetry/transport.rs                                                    6       0  100.00%
crates/trogon-decider-runtime/src/headers/header_map.rs                                      54       3  94.44%   20-22
crates/trogon-decider-runtime/src/headers/header_value.rs                                    34       0  100.00%
crates/trogon-decider-runtime/src/headers/header_name.rs                                     28       0  100.00%
crates/trogon-decider-runtime/src/headers/mod.rs                                             74       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_envelope_encode_error.rs           14       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_payload_decode.rs                   3       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_envelope_decode_error.rs           28       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/encoded_snapshot.rs                        117       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_encode_error.rs                    36       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_decode_error.rs                    49       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/session_update.rs                               12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_create.rs                              12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_wait_for_exit.rs                       12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_kill.rs                                12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_write_text_file.rs                           12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_read_text_file.rs                            12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/session_request_permission.rs                   12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_output.rs                              12       0  100.00%
crates/trogon-gateway/src/source/slack/socket_mode.rs                                       716       0  100.00%
crates/trogon-gateway/src/source/slack/signature.rs                                          66       0  100.00%
crates/trogon-gateway/src/source/slack/config.rs                                             58       0  100.00%
crates/trogon-gateway/src/source/slack/server.rs                                            853       0  100.00%
crates/trogon-scheduler/src/commands/domain/schedule_event_sampling_source.rs                20       0  100.00%
crates/trogon-scheduler/src/commands/domain/schedule_event_schedule.rs                       83       0  100.00%
crates/trogon-scheduler/src/commands/domain/recurrence.rs                                   179       1  99.44%   99
crates/trogon-scheduler/src/commands/domain/schedule_id.rs                                   81       0  100.00%
crates/trogon-scheduler/src/commands/domain/schedule_occurrence_sequence.rs                  30       0  100.00%
crates/trogon-scheduler/src/commands/domain/schedule.rs                                     638       0  100.00%
crates/trogon-scheduler/src/commands/domain/schedule_event_status.rs                         10       0  100.00%
crates/trogon-scheduler/src/commands/domain/schedule_event_delivery.rs                       25       0  100.00%
crates/trogon-scheduler/src/commands/domain/message.rs                                      219       0  100.00%
crates/mcp-nats/src/nats/subjects/server/elicitation_completed.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/resource_list_changed.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/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_tools.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/initialize.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/get_task.rs                                         12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/progress.rs                                         12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/tool_list_changed.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/cancel_task.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/get_task_result.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/call_tool.rs                                        12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/read_resource.rs                                    12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/get_prompt.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/set_logging_level.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/list_resource_templates.rs                          12       0  100.00%
crates/trogon-scheduler/src/processor/execution/wakeup.rs                                   353       7  98.02%   83-85, 127, 400, 416, 585
crates/trogon-gateway/src/source/linear/server.rs                                           386       0  100.00%
crates/trogon-gateway/src/source/linear/signature.rs                                         54       1  98.15%   16
crates/trogon-gateway/src/source/linear/config.rs                                            17       0  100.00%
crates/trogon-decider-runtime/src/event/mod.rs                                              170       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/trogon-service-config/src/lib.rs                                                      92       0  100.00%
crates/trogon-scheduler/src/telemetry/trace.rs                                               41       0  100.00%
crates/trogon-scheduler/src/telemetry/metrics.rs                                             52       0  100.00%
crates/acp-nats/src/nats/subjects/mod.rs                                                    362       0  100.00%
crates/acp-nats/src/nats/subjects/stream.rs                                                  56       0  100.00%
crates/mcp-nats/src/nats/subjects/client/cancelled.rs                                        12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/ping.rs                                              9       0  100.00%
crates/mcp-nats/src/nats/subjects/client/create_message.rs                                   12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/progress.rs                                         12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/initialized.rs                                      12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/roots_list_changed.rs                               12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/list_roots.rs                                       12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/create_elicitation.rs                               12       0  100.00%
crates/trogon-scheduler/src/processor/execution/execution_schedules/mod.rs                  270       0  100.00%
crates/acp-nats-agent/src/connection.rs                                                    1252       1  99.92%   583
crates/trogon-decider-runtime/src/stream/mod.rs                                              38       0  100.00%
crates/trogon-decider-runtime/src/stream/append_stream.rs                                     5       0  100.00%
crates/trogon-decider-runtime/src/stream/stream_position.rs                                  26       0  100.00%
crates/trogon-decider-runtime/src/stream/read_stream.rs                                       7       0  100.00%
crates/a2a-nats-stdio/src/runtime.rs                                                        102       0  100.00%
crates/a2a-nats-stdio/src/io_loop.rs                                                         84       0  100.00%
crates/a2a-nats-stdio/src/main.rs                                                             4       0  100.00%
crates/a2a-nats-stdio/src/dispatch.rs                                                       839      11  98.69%   116, 119-121, 229, 232-234, 668, 1058, 1068
crates/a2a-nats-stdio/src/wire.rs                                                            57       0  100.00%
crates/trogon-std/src/fs/system.rs                                                           92       0  100.00%
crates/trogon-std/src/fs/mem.rs                                                             216      10  95.37%   61-63, 77-79, 132-134, 157
crates/trogon-gateway/src/source/github/server.rs                                           328       0  100.00%
crates/trogon-gateway/src/source/github/config.rs                                            17       0  100.00%
crates/trogon-gateway/src/source/github/signature.rs                                         50       0  100.00%
crates/a2a-auth-callout/src/credentials/api_key.rs                                          130      13  90.00%   30-33, 41-46, 56, 61-63
crates/a2a-auth-callout/src/credentials/mtls.rs                                             212      29  86.32%   60-62, 71-72, 81, 118-122, 131-135, 151, 153-154, 168-169, 209-213, 216-219
crates/a2a-auth-callout/src/credentials/oidc.rs                                             405      24  94.07%   18-19, 21-23, 48-50, 160, 164, 178, 212-218, 278-280, 306, 450, 509, 528
crates/acp-nats/src/nats/subjects/subscriptions/all_client.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_session.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.rs                                  9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/global_all.rs                                 9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_agent.rs                                 15       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_agent_ext.rs                              9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_session.rs                               12       0  100.00%
crates/a2a-auth-callout/src/jwt/mod.rs                                                      328     116  64.63%   28-31, 45-51, 59-78, 115-118, 123, 181, 185-187, 196-220, 243, 252-254, 273, 280-283, 306-308, 311-313, 319-330, 362-392, 413-420, 444, 449-453
crates/a2a-auth-callout/src/jwt/nats_user_jwt.rs                                            232      21  90.95%   131, 178, 187-196, 209, 214, 228, 237-242, 284, 288, 313
crates/a2a-auth-callout/src/jwt/user_jwt_subject.rs                                          12       6  50.00%   18-26
crates/a2a-auth-callout/src/jwt/nats_permission_claims.rs                                    10       0  100.00%
crates/trogon-nats/src/lease/nats_kv_lease_config.rs                                         26       0  100.00%
crates/trogon-nats/src/lease/mod.rs                                                         523      13  97.51%   113-126
crates/trogon-nats/src/lease/renew_interval.rs                                               57       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/acquire.rs                                                       5       5  0.00%    9-14
crates/trogon-nats/src/lease/renew.rs                                                       246      19  92.28%   23-29, 48-59
crates/trogon-nats/src/lease/ttl.rs                                                          68       0  100.00%
crates/trogon-nats/src/lease/provision.rs                                                   187      10  94.65%   82-92
crates/trogon-nats/src/lease/lease_key.rs                                                    19       0  100.00%
crates/trogon-nats/src/lease/lease_timing.rs                                                 15       0  100.00%
crates/acp-nats/src/agent/set_session_config_option.rs                                       67       0  100.00%
crates/acp-nats/src/agent/prompt.rs                                                         471       0  100.00%
crates/acp-nats/src/agent/set_session_mode.rs                                                67       0  100.00%
crates/acp-nats/src/agent/js_request.rs                                                     283       0  100.00%
crates/acp-nats/src/agent/ext_method.rs                                                      82       0  100.00%
crates/acp-nats/src/agent/authenticate.rs                                                    49       0  100.00%
crates/acp-nats/src/agent/initialize.rs                                                      79       0  100.00%
crates/acp-nats/src/agent/mod.rs                                                             65       0  100.00%
crates/acp-nats/src/agent/bridge.rs                                                         123       4  96.75%   108-111
crates/acp-nats/src/agent/load_session.rs                                                    89       0  100.00%
crates/acp-nats/src/agent/set_session_model.rs                                               67       0  100.00%
crates/acp-nats/src/agent/fork_session.rs                                                    94       0  100.00%
crates/acp-nats/src/agent/cancel.rs                                                         101       0  100.00%
crates/acp-nats/src/agent/test_support.rs                                                   267       0  100.00%
crates/acp-nats/src/agent/new_session.rs                                                     82       0  100.00%
crates/acp-nats/src/agent/ext_notification.rs                                                82       0  100.00%
crates/acp-nats/src/agent/logout.rs                                                          49       0  100.00%
crates/acp-nats/src/agent/list_sessions.rs                                                   47       0  100.00%
crates/acp-nats/src/agent/close_session.rs                                                   63       0  100.00%
crates/acp-nats/src/agent/resume_session.rs                                                  90       0  100.00%
crates/a2a-nats-http/src/router.rs                                                           55      14  74.55%   59-63, 69-79
crates/a2a-nats-http/src/rest.rs                                                            316     287  9.18%    63-415, 420-425, 427-428, 432-437
crates/a2a-nats-http/src/sse.rs                                                              44      28  36.36%   15-51, 61-68
crates/a2a-nats-http/src/headers.rs                                                         167       6  96.41%   94, 103, 159, 220-222
crates/a2a-nats-http/src/main.rs                                                              4       0  100.00%
crates/a2a-nats-http/src/runtime.rs                                                          30      26  13.33%   36-45, 51-147
crates/a2a-nats/src/catalog/import_gate/error.rs                                              9       0  100.00%
crates/a2a-nats/src/catalog/import_gate/principal.rs                                         14       0  100.00%
crates/a2a-nats/src/catalog/import_gate/allow_all.rs                                          2       0  100.00%
crates/trogon-std/src/duration.rs                                                            42       0  100.00%
crates/trogon-std/src/http.rs                                                                19       0  100.00%
crates/trogon-std/src/json.rs                                                                30       0  100.00%
crates/trogon-std/src/signal.rs                                                              26      12  53.85%   6-11, 18-25, 34
crates/trogon-std/src/args.rs                                                                19       9  52.63%   11-28
crates/trogon-std/src/secret_string.rs                                                       32       0  100.00%
crates/trogon-std/src/uuid.rs                                                                 7       0  100.00%
crates/trogon-std/src/dirs/system.rs                                                         71       0  100.00%
crates/trogon-std/src/dirs/fixed.rs                                                          80       0  100.00%
crates/trogonai-proto/src/scheduler/schedules/codec.rs                                      377       0  100.00%
crates/a2a-auth-callout/src/account_resolver.rs                                              58       6  89.66%   32-37, 48
crates/a2a-auth-callout/src/dispatcher.rs                                                   167      19  88.62%   58-62, 82-112
crates/a2a-auth-callout/src/denial_claims.rs                                                135      30  77.78%   21-25, 34, 53-57, 66, 85-89, 98, 125-150
crates/a2a-auth-callout/src/denial_reason.rs                                                 35       0  100.00%
crates/a2a-auth-callout/src/denial_category.rs                                               90       1  98.89%   40
crates/a2a-auth-callout/src/error.rs                                                        117       2  98.29%   28, 104
crates/a2a-auth-callout/src/caller_jwt_header.rs                                             20      20  0.00%    11-39
crates/a2a-auth-callout/src/permissions.rs                                                  179      19  89.39%   16-34, 126-139
crates/a2a-auth-callout/src/subscriber.rs                                                    96      96  0.00%    26-177
crates/a2a-auth-callout/src/main.rs                                                         143     143  0.00%    21-217
crates/a2a-auth-callout/src/test_support.rs                                                  20      20  0.00%    16-36
crates/mcp-nats-stdio/src/config.rs                                                         149       0  100.00%
crates/mcp-nats-stdio/src/main.rs                                                           204       0  100.00%
crates/a2a-nats/src/catalog/registrar.rs                                                    211       0  100.00%
crates/a2a-nats/src/catalog/watch.rs                                                         99       0  100.00%
crates/a2a-nats/src/catalog/store.rs                                                        382       0  100.00%
crates/a2a-nats/src/catalog/nats_kv.rs                                                       19       0  100.00%
TOTAL                                                                                     66216    2075  96.87%

Diff against main

Filename                                                                Stmts    Miss  Cover
--------------------------------------------------------------------  -------  ------  -------
crates/trogon-scheduler/src/processor/execution/worker/dispatcher.rs      +17       0  +0.00%
TOTAL                                                                     +17       0  +0.00%

Results for commit: 72d3417

Minimum allowed coverage is 95%

♻️ This comment has been updated with latest results

@yordis yordis force-pushed the yordis/feat-error-string-lint branch from 34da8eb to 9656ae6 Compare June 21, 2026 09:22
Comment thread rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs
Comment thread rsworkspace/dylints/trogon_lints/src/lib.rs
@yordis yordis force-pushed the yordis/feat-error-string-lint branch 3 times, most recently from bbb18d0 to 9cf2ee1 Compare June 21, 2026 09:34
Comment thread rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs
Comment thread rsworkspace/dylints/trogon_lints/src/lib.rs
@yordis yordis force-pushed the yordis/feat-error-string-lint branch from 9cf2ee1 to f23d066 Compare June 21, 2026 09:37
Comment thread .config/mise/tasks/rust-pr-check Outdated
Comment thread rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs
@yordis yordis force-pushed the yordis/feat-error-string-lint branch from f23d066 to d838d75 Compare June 21, 2026 18:25
Comment thread rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs
Comment thread .github/workflows/ci-rust.yml Outdated

@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: 3

🤖 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 @.github/workflows/ci-rust.yml:
- Around line 57-60: The `Run repo Rust policy lints` step runs cargo dylint
from the rsworkspace root with RUSTUP_TOOLCHAIN unset and uses --path to
reference a subdirectory containing its own rust-toolchain.toml with
nightly-2026-04-16. Cargo may not automatically traverse into the subdirectory's
toolchain configuration when invoked from a parent without an active toolchain.
Fix this by either changing the working-directory to
rsworkspace/dylints/trogon_lints and adjusting the --path argument accordingly,
or by explicitly setting the required toolchain at the rsworkspace root level
using a rust-toolchain.toml or adding a rustup override set command before the
cargo dylint invocation.

In `@rsworkspace/dylints/trogon_lints/Cargo.toml`:
- Line 5: The edition field in the Cargo.toml file is set to "2024", which is
not a valid Rust edition and will cause the build to fail. Change the edition
value in the edition = "2024" line to "2021", which is the latest supported
edition. Replace "2024" with "2021" to resolve the manifest parsing error.

In `@rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs`:
- Around line 69-71: The pattern matching in the conditional expression
incorrectly pairs PatKind::TupleStruct with ExprKind::Tup. Tuple-struct
constructors (like Foo(a, b)) are represented as ExprKind::Call, not
ExprKind::Tup which represents literal tuples. Separate the PatKind::TupleStruct
case from PatKind::Tuple and create a new match arm that pairs
PatKind::TupleStruct with ExprKind::Call to correctly handle tuple-struct
destructuring patterns and ensure taint is properly bound for cases like
Foo(error.to_string(), ...).
🪄 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: ef9ed82e-7cd1-4f65-bae6-517bc7169462

📥 Commits

Reviewing files that changed from the base of the PR and between 7daf7c4 and d838d75.

⛔ Files ignored due to path filters (1)
  • rsworkspace/dylints/trogon_lints/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (13)
  • .config/mise/tasks/rust-pr-check
  • .github/actions/setup-rust/action.yml
  • .github/workflows/ci-rust.yml
  • .mise.toml
  • rsworkspace/dylints/trogon_lints/.cargo/config.toml
  • rsworkspace/dylints/trogon_lints/.gitignore
  • rsworkspace/dylints/trogon_lints/Cargo.toml
  • rsworkspace/dylints/trogon_lints/README.md
  • rsworkspace/dylints/trogon_lints/rust-toolchain.toml
  • rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs
  • rsworkspace/dylints/trogon_lints/src/lib.rs
  • rsworkspace/dylints/trogon_lints/ui/main.rs
  • rsworkspace/dylints/trogon_lints/ui/main.stderr

Comment thread .github/workflows/ci-rust.yml
Comment thread rsworkspace/dylints/trogon_lints/Cargo.toml
Comment thread rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs Outdated
@yordis yordis force-pushed the yordis/feat-error-string-lint branch from d838d75 to 157ec51 Compare June 21, 2026 18:43
Comment thread .github/workflows/ci-rust.yml Outdated
@yordis yordis force-pushed the yordis/feat-error-string-lint branch 3 times, most recently from a66dd7c to 745965b Compare June 21, 2026 18:58
Comment thread rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs
@yordis yordis force-pushed the yordis/feat-error-string-lint branch 2 times, most recently from 4d277a1 to 35df76d Compare June 21, 2026 19:04
Comment thread rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs
Comment thread .github/actions/setup-rust/action.yml
@yordis yordis force-pushed the yordis/feat-error-string-lint branch 5 times, most recently from 8bbb647 to f520c41 Compare June 21, 2026 19:39

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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 @.github/actions/setup-rust/action.yml:
- Around line 15-22: The nightly version nightly-2026-04-16 is hardcoded in the
Install Dylint Rust components step, creating maintenance drift with the version
declared in rsworkspace/dylints/trogon_lints/rust-toolchain.toml. Remove the
explicit rustup toolchain install command for the hardcoded nightly version and
remove the --toolchain nightly-2026-04-16 flag from the rustup component add
command. Instead, rely on rustup's automatic toolchain detection which will use
the version specified in the rust-toolchain.toml file, eliminating the need to
maintain the version in two places.
🪄 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: 8a91b6d0-5478-46fb-8647-5c1a31d04966

📥 Commits

Reviewing files that changed from the base of the PR and between d838d75 and 7eed634.

⛔ Files ignored due to path filters (1)
  • rsworkspace/dylints/trogon_lints/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (15)
  • .config/mise/tasks/rust-pr-check
  • .github/actions/setup-rust/action.yml
  • .github/workflows/ci-rust.yml
  • .mise.toml
  • rsworkspace/crates/trogon-scheduler/src/processor/execution/worker/dispatcher.rs
  • rsworkspace/dylints/trogon_lints/.cargo/config.toml
  • rsworkspace/dylints/trogon_lints/.gitignore
  • rsworkspace/dylints/trogon_lints/Cargo.toml
  • rsworkspace/dylints/trogon_lints/README.md
  • rsworkspace/dylints/trogon_lints/rust-toolchain.toml
  • rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs
  • rsworkspace/dylints/trogon_lints/src/lib.rs
  • rsworkspace/dylints/trogon_lints/ui/main.rs
  • rsworkspace/dylints/trogon_lints/ui/main.stderr
  • rust-toolchain.toml
✅ Files skipped from review due to trivial changes (6)
  • rsworkspace/dylints/trogon_lints/.gitignore
  • rsworkspace/dylints/trogon_lints/.cargo/config.toml
  • rust-toolchain.toml
  • rsworkspace/dylints/trogon_lints/rust-toolchain.toml
  • rsworkspace/dylints/trogon_lints/README.md
  • rsworkspace/dylints/trogon_lints/ui/main.stderr
🚧 Files skipped from review as they are similar to previous changes (6)
  • rsworkspace/dylints/trogon_lints/Cargo.toml
  • .mise.toml
  • .github/workflows/ci-rust.yml
  • rsworkspace/dylints/trogon_lints/src/lib.rs
  • .config/mise/tasks/rust-pr-check
  • rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs

Comment thread .github/actions/setup-rust/action.yml
@yordis yordis force-pushed the yordis/feat-error-string-lint branch 2 times, most recently from f8ded0d to 8049295 Compare June 21, 2026 19:45
Comment thread .github/workflows/ci-rust.yml
@yordis yordis force-pushed the yordis/feat-error-string-lint branch from 8049295 to 975efb0 Compare June 21, 2026 20:01
Comment thread .github/actions/setup-rust/action.yml Outdated
@yordis yordis force-pushed the yordis/feat-error-string-lint branch 2 times, most recently from e003664 to 6955dd9 Compare June 21, 2026 20:07
Comment thread rsworkspace/dylints/trogon_lints/src/error_string_comparison.rs
@yordis yordis force-pushed the yordis/feat-error-string-lint branch from 6955dd9 to 2253e82 Compare June 21, 2026 20:19

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 2253e82. Configure here.

Comment thread .github/workflows/ci-rust.yml Outdated
Comment thread .config/mise/tasks/rust-pr-check Outdated
@yordis yordis force-pushed the yordis/feat-error-string-lint branch from 2253e82 to 784de19 Compare June 21, 2026 20:27
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
@yordis yordis force-pushed the yordis/feat-error-string-lint branch from 784de19 to 72d3417 Compare June 21, 2026 20:34
@yordis yordis merged commit a690ea4 into main Jun 21, 2026
7 checks passed
@yordis yordis deleted the yordis/feat-error-string-lint branch June 21, 2026 20:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant