Skip to content

feat(decider): add typed decider primitives#164

Merged
yordis merged 1 commit into
mainfrom
yordis/chore-create-pr-v1
May 16, 2026
Merged

feat(decider): add typed decider primitives#164
yordis merged 1 commit into
mainfrom
yordis/chore-create-pr-v1

Conversation

@yordis

@yordis yordis commented May 16, 2026

Copy link
Copy Markdown
Member
  • Event-sourced workflows need a shared typed decision boundary so command handling stays consistent across crates.
  • Multi-step decisions need to preserve state progression and write preconditions without leaking persistence concerns.

@cursor

cursor Bot commented May 16, 2026

Copy link
Copy Markdown

PR Summary

Medium Risk
Adds a new foundational crate defining the command-to-events decision boundary (including multi-step execution), which could affect future workflow/persistence integrations if adopted broadly. Current PR is mostly additive with tests, but introduces new public APIs and error semantics that downstream crates will rely on.

Overview
Introduces a new trogon-decider crate that standardizes a typed decider boundary for event-sourced workflows via the Decider trait and Decision outcome type.

Adds an Events non-empty batch type and WritePrecondition concurrency guard, plus a multi-step Decision::act() builder (ActBuilder/Act) that chains steps while evolving state and propagating decide/evolve errors. Updates Cargo.lock and includes unit tests/doctests covering chaining, error propagation, and event batch utilities.

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

@coderabbitai

coderabbitai Bot commented May 16, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Rate limit exceeded

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

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

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

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

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

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

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 930ceb82-1919-4ba0-8c61-9c44eb7b6dd6

📥 Commits

Reviewing files that changed from the base of the PR and between 5a75684 and ff590a6.

⛔ Files ignored due to path filters (1)
  • rsworkspace/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (6)
  • rsworkspace/crates/trogon-decider/Cargo.toml
  • rsworkspace/crates/trogon-decider/src/act.rs
  • rsworkspace/crates/trogon-decider/src/decision.rs
  • rsworkspace/crates/trogon-decider/src/events.rs
  • rsworkspace/crates/trogon-decider/src/lib.rs
  • rsworkspace/crates/trogon-decider/src/write_precondition.rs

Walkthrough

The PR introduces a complete new Rust crate, trogon-decider, implementing a typed event sourcing decider abstraction. It defines a Decider trait coupling commands to state/event/error types, provides a Decision enum for either immediate events or deferred multi-step acts, and includes a typestate ActBuilder for chaining decision steps while accumulating events and threading state.

Changes

Decider Framework

Layer / File(s) Summary
Foundational types and Decider trait
rsworkspace/crates/trogon-decider/src/write_precondition.rs, rsworkspace/crates/trogon-decider/src/events.rs, rsworkspace/crates/trogon-decider/src/lib.rs
WritePrecondition defines stream append preconditions (Any, StreamExists, NoStream). Events<T> enforces non-empty invariant via constructors and provides map/try_map transformations. Decider trait specifies StreamId, State, Event types and four required methods: stream_id, initial_state, evolve, decide with separate error channels.
Decision model and handling
rsworkspace/crates/trogon-decider/src/decision.rs
Decision<C> enum holds either Events or deferred Act. DecisionFailure and DecisionResult unify decide/evolve errors. handle method applies events through state evolution or executes deferred acts, mapping evolve errors into DecisionFailure::Evolve.
Act builder and step execution
rsworkspace/crates/trogon-decider/src/act.rs
ActBuilder and ActChain use typestate to build multi-step plans. Act<C> boxes a dyn ActRun<C>. Steps trait with First/Then step nodes execute closures sequentially, evolving state and accumulating events between steps.
Crate configuration and comprehensive tests
rsworkspace/crates/trogon-decider/Cargo.toml, rsworkspace/crates/trogon-decider/src/lib.rs
Cargo.toml configures strict lints (deny warnings, forbid cfg(coverage), deny Clippy all/expect_used/panic/unwrap_used). Module declarations and public re-exports wire the framework. Comprehensive test suite validates act chaining, state threading, error propagation, Events empty-vector rejection, and compile-time type relationships.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 A decider's born today, with traits so fine and strong,
Events bundled tight, in sequences that belong,
Act chains build in steps, each closure threads the state,
Type-safe, yet dynamic—what a crate to celebrate! 🎉
From writes to evolves, preconditions keep the guard,
Trogon's foundation laid—this was worth the hard! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title directly and clearly describes the main change: introducing typed decider primitives to the codebase.
Description check ✅ Passed The description explains the motivation and purpose of the changes, relating to event-sourced workflows and multi-step decisions.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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 unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch yordis/chore-create-pr-v1

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.

@github-actions

github-actions Bot commented May 16, 2026

Copy link
Copy Markdown

badge

Code Coverage Summary

Details
Filename                                                                      Stmts    Miss  Cover    Missing
--------------------------------------------------------------------------  -------  ------  -------  ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
crates/trogon-std/src/args.rs                                                    19       9  52.63%   11-28
crates/trogon-std/src/duration.rs                                                45       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/http.rs                                                    19       0  100.00%
crates/trogon-std/src/secret_string.rs                                           35       0  100.00%
crates/trogon-std/src/uuid.rs                                                     7       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_output.rs                  12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_create.rs                  12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_release.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/fs_write_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/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/terminal_wait_for_exit.rs           12       0  100.00%
crates/trogon-std/src/dirs/fixed.rs                                              80       0  100.00%
crates/trogon-std/src/dirs/system.rs                                             71       0  100.00%
crates/trogon-gateway/src/source/sentry/signature.rs                             54       0  100.00%
crates/trogon-gateway/src/source/sentry/sentry_client_secret.rs                  17       0  100.00%
crates/trogon-gateway/src/source/sentry/server.rs                               311       0  100.00%
crates/trogon-telemetry/src/lib.rs                                              197      23  88.32%   94, 99, 104, 114-115, 121-139, 175, 178, 181, 187
crates/trogon-telemetry/src/resource_attribute.rs                                23       0  100.00%
crates/trogon-telemetry/src/trace.rs                                             23       1  95.65%   22
crates/trogon-telemetry/src/service_name.rs                                      44       0  100.00%
crates/trogon-telemetry/src/log.rs                                               68       1  98.53%   33
crates/trogon-telemetry/src/metric.rs                                            26       1  96.15%   29
crates/acp-nats/src/pending_prompt_waiters.rs                                   134       0  100.00%
crates/acp-nats/src/in_flight_slot_guard.rs                                      32       0  100.00%
crates/acp-nats/src/req_id.rs                                                    39       0  100.00%
crates/acp-nats/src/jsonrpc.rs                                                    6       0  100.00%
crates/acp-nats/src/acp_prefix.rs                                                50       0  100.00%
crates/acp-nats/src/client_proxy.rs                                             181       0  100.00%
crates/acp-nats/src/lib.rs                                                       69       0  100.00%
crates/acp-nats/src/session_id.rs                                                71       0  100.00%
crates/acp-nats/src/ext_method_name.rs                                           68       0  100.00%
crates/acp-nats/src/config.rs                                                   203       0  100.00%
crates/acp-nats/src/error.rs                                                     82       0  100.00%
crates/mcp-nats/src/nats/subjects/client/create_message.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/cancelled.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/list_roots.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/roots_list_changed.rs                   12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/progress.rs                             12       0  100.00%
crates/acp-nats/src/agent/js_request.rs                                         283       0  100.00%
crates/acp-nats/src/agent/prompt.rs                                             471       0  100.00%
crates/acp-nats/src/agent/bridge.rs                                             123       4  96.75%   108-111
crates/acp-nats/src/agent/list_sessions.rs                                       47       0  100.00%
crates/acp-nats/src/agent/set_session_mode.rs                                    67       0  100.00%
crates/acp-nats/src/agent/set_session_model.rs                                   67       0  100.00%
crates/acp-nats/src/agent/resume_session.rs                                      90       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/test_support.rs                                       267       0  100.00%
crates/acp-nats/src/agent/ext_notification.rs                                    82       0  100.00%
crates/acp-nats/src/agent/cancel.rs                                             101       0  100.00%
crates/acp-nats/src/agent/initialize.rs                                          79       0  100.00%
crates/acp-nats/src/agent/logout.rs                                              49       0  100.00%
crates/acp-nats/src/agent/mod.rs                                                 65       0  100.00%
crates/acp-nats/src/agent/set_session_config_option.rs                           67       0  100.00%
crates/acp-nats/src/agent/new_session.rs                                         82       0  100.00%
crates/acp-nats/src/agent/fork_session.rs                                        94       0  100.00%
crates/acp-nats/src/agent/load_session.rs                                        89       0  100.00%
crates/acp-nats/src/agent/close_session.rs                                       63       0  100.00%
crates/trogon-std/src/telemetry/http.rs                                         217       0  100.00%
crates/acp-nats/src/nats/mod.rs                                                  23       0  100.00%
crates/acp-nats/src/nats/parsing.rs                                             278       1  99.64%   151
crates/acp-nats/src/nats/extensions.rs                                            3       0  100.00%
crates/trogon-decider/src/act.rs                                                 62       0  100.00%
crates/trogon-decider/src/events.rs                                              49       0  100.00%
crates/trogon-decider/src/lib.rs                                                144       0  100.00%
crates/trogon-decider/src/decision.rs                                            30       0  100.00%
crates/mcp-nats-stdio/src/main.rs                                               212       0  100.00%
crates/mcp-nats-stdio/src/config.rs                                             160       0  100.00%
crates/acp-nats/src/nats/subjects/stream.rs                                      56       0  100.00%
crates/acp-nats/src/nats/subjects/mod.rs                                        362       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/global_all.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/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/all_agent_ext.rs                  9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_agent.rs                     15       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_client.rs                    15       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/prompt_wildcard.rs                9       0  100.00%
crates/acp-nats/src/nats/subjects/commands/prompt.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/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/close.rs                              15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_config_option.rs                  15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_mode.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/global/authenticate.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/ext.rs                                   9       0  100.00%
crates/acp-nats/src/nats/subjects/global/logout.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/initialize.rs                            6       0  100.00%
crates/trogon-gateway/src/source/discord/config.rs                              108       0  100.00%
crates/trogon-gateway/src/source/discord/gateway.rs                             426       1  99.77%   137
crates/trogon-gateway/src/source/standard_webhooks.rs                           172       0  100.00%
crates/acp-nats/src/client/terminal_output.rs                                   206       0  100.00%
crates/acp-nats/src/client/ext.rs                                               308       8  97.40%   163-172, 189-198
crates/acp-nats/src/client/terminal_create.rs                                   274       0  100.00%
crates/acp-nats/src/client/terminal_wait_for_exit.rs                            378       0  100.00%
crates/acp-nats/src/client/fs_write_text_file.rs                                418       0  100.00%
crates/acp-nats/src/client/terminal_kill.rs                                     290       0  100.00%
crates/acp-nats/src/client/ext_session_prompt_response.rs                       135       0  100.00%
crates/acp-nats/src/client/mod.rs                                              2851       0  100.00%
crates/acp-nats/src/client/session_update.rs                                     55       0  100.00%
crates/acp-nats/src/client/request_permission.rs                                308       0  100.00%
crates/acp-nats/src/client/terminal_release.rs                                  347       0  100.00%
crates/acp-nats/src/client/fs_read_text_file.rs                                 356       0  100.00%
crates/acp-nats/src/client/rpc_reply.rs                                          64       0  100.00%
crates/acp-nats-server/src/config.rs                                            137       9  93.43%   41, 50-61
crates/acp-nats-server/src/main.rs                                              896      10  98.88%   100, 231-238, 437
crates/acp-nats-server/src/transport.rs                                        1852     106  94.28%   277, 536, 554, 581, 635, 640, 659, 671, 790, 813-815, 867, 884-887, 982-985, 1059, 1062, 1065, 1074, 1078, 1081, 1084-1087, 1106, 1138-1141, 1149-1154, 1166-1170, 1174-1183, 1195-1196, 1214-1215, 1225, 1241-1245, 1273-1279, 1298-1300, 1305-1309, 1312-1317, 1334, 1336-1337, 1419-1420, 1432-1433, 1453-1454, 1506-1522, 2218, 2261, 2313, 2368, 2380
crates/acp-nats-server/src/acp_connection_id.rs                                  45       0  100.00%
crates/acp-nats-server/src/connection.rs                                        171      32  81.29%   76-83, 88-99, 115, 117-118, 123, 132-133, 138, 142, 146, 149, 157, 161, 164, 167-171, 207
crates/acp-nats-stdio/src/main.rs                                               135      25  81.48%   65, 113-120, 126-128, 145, 174-193
crates/acp-nats-stdio/src/config.rs                                              66       0  100.00%
crates/acp-nats-agent/src/connection.rs                                        1270       1  99.92%   607
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_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/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/call_tool.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/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/elicitation_completed.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/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/cancel_task.rs                          12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/cancelled.rs                            12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/list_resource_templates.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/progress.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/logging_message.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/resource_list_changed.rs                12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/resource_updated.rs                     12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/set_logging_level.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_prompt.rs                           12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/subscribe_resource.rs                   12       0  100.00%
crates/acp-nats/src/jetstream/streams.rs                                        163       4  97.55%   206-208, 218
crates/acp-nats/src/jetstream/ext_policy.rs                                      26       0  100.00%
crates/acp-nats/src/jetstream/consumers.rs                                       91       0  100.00%
crates/acp-nats/src/jetstream/provision.rs                                       53       0  100.00%
crates/trogon-nats/src/auth.rs                                                  114       0  100.00%
crates/trogon-nats/src/token.rs                                                   6       0  100.00%
crates/trogon-nats/src/messaging.rs                                             561       2  99.64%   144, 154
crates/trogon-nats/src/mocks.rs                                                 317       0  100.00%
crates/trogon-nats/src/subject_token_violation.rs                                17       0  100.00%
crates/trogon-nats/src/nats_token.rs                                            157       0  100.00%
crates/trogon-nats/src/connect.rs                                                94       9  90.43%   22-23, 33, 60-65
crates/trogon-nats/src/client.rs                                                 22      22  0.00%    50-86
crates/trogon-nats/src/jetstream/publish.rs                                      64       0  100.00%
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      46  0.00%    152-262
crates/trogon-nats/src/jetstream/mocks.rs                                       748      32  95.72%   367-381, 387-395, 410-416, 430-433, 497-499
crates/trogon-nats/src/jetstream/claim_check.rs                                 346       0  100.00%
crates/trogon-gateway/src/source/linear/server.rs                               386       0  100.00%
crates/trogon-gateway/src/source/linear/config.rs                                17       0  100.00%
crates/trogon-gateway/src/source/linear/signature.rs                             54       1  98.15%   16
crates/acp-nats/src/nats/subjects/responses/update.rs                            27       0  100.00%
crates/acp-nats/src/nats/subjects/responses/prompt_response.rs                   27       0  100.00%
crates/acp-nats/src/nats/subjects/responses/cancelled.rs                         15       0  100.00%
crates/acp-nats/src/nats/subjects/responses/response.rs                          20       0  100.00%
crates/acp-nats/src/nats/subjects/responses/ext_ready.rs                         12       0  100.00%
crates/trogon-service-config/src/lib.rs                                          92       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/time/system.rs                                             31       0  100.00%
crates/trogon-std/src/time/mock.rs                                              125       0  100.00%
crates/mcp-nats/src/telemetry/transport.rs                                        6       0  100.00%
crates/mcp-nats-server/src/allowed_host.rs                                       90       0  100.00%
crates/mcp-nats-server/src/config.rs                                            276       0  100.00%
crates/mcp-nats-server/src/main.rs                                              357     127  64.43%   149-166, 202-204, 214, 220-221, 228-231, 255-257, 261-270, 292-305, 310-358, 489, 492, 500-542
crates/mcp-nats/src/nats/mod.rs                                                  99       0  100.00%
crates/mcp-nats/src/nats/parsing.rs                                             191       0  100.00%
crates/mcp-nats/src/server.rs                                                    31       0  100.00%
crates/mcp-nats/src/transport.rs                                                722       0  100.00%
crates/mcp-nats/src/config.rs                                                   110       0  100.00%
crates/mcp-nats/src/mcp_peer_id.rs                                               33       0  100.00%
crates/mcp-nats/src/jsonrpc.rs                                                   22       0  100.00%
crates/mcp-nats/src/client.rs                                                    31       0  100.00%
crates/mcp-nats/src/mcp_prefix.rs                                                36       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/trogon-gateway/src/source/slack/server.rs                                863       0  100.00%
crates/trogon-gateway/src/source/slack/signature.rs                              77       0  100.00%
crates/trogon-gateway/src/source/slack/config.rs                                 17       0  100.00%
crates/trogon-gateway/src/source/twitter/config.rs                               17       0  100.00%
crates/trogon-gateway/src/source/twitter/signature.rs                            69       0  100.00%
crates/trogon-gateway/src/source/twitter/server.rs                              525       0  100.00%
crates/trogon-nats/src/lease/nats_kv_lease_config.rs                             26       0  100.00%
crates/trogon-nats/src/lease/release.rs                                           5       5  0.00%    8-12
crates/trogon-nats/src/lease/lease_config_error.rs                               11       0  100.00%
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/trogon-nats/src/lease/mod.rs                                             561      13  97.68%   180-193
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/lease_bucket.rs                                     19       0  100.00%
crates/trogon-nats/src/lease/ttl.rs                                              73       0  100.00%
crates/trogon-nats/src/lease/provision.rs                                       187      10  94.65%   82-92
crates/trogon-nats/src/lease/renew_interval.rs                                   61       0  100.00%
crates/trogon-gateway/src/source/telegram/config.rs                             109       0  100.00%
crates/trogon-gateway/src/source/telegram/registration.rs                       327       0  100.00%
crates/trogon-gateway/src/source/telegram/server.rs                             339       0  100.00%
crates/trogon-gateway/src/source/telegram/signature.rs                           32       0  100.00%
crates/trogon-std/src/fs/mem.rs                                                 216      10  95.37%   61-63, 77-79, 132-134, 157
crates/trogon-std/src/fs/system.rs                                               92       0  100.00%
crates/trogon-gateway/src/source_integration_id.rs                               61       3  95.08%   55, 57, 65
crates/trogon-gateway/src/source_status.rs                                       28       0  100.00%
crates/trogon-gateway/src/http.rs                                               192       1  99.48%   119
crates/trogon-gateway/src/main.rs                                               116       0  100.00%
crates/trogon-gateway/src/config.rs                                            2559      48  98.12%   91, 110, 328-329, 332, 712, 715, 875, 878, 881, 885, 960, 963, 966, 970, 1054-1061, 1138, 1141, 1144, 1149, 1207, 1210, 1213, 1292, 1295, 1298, 1302, 1366, 1369, 1372, 1435, 1438, 1441, 1446, 1521, 1524, 1527, 1532, 1590, 1593, 1596, 1809-1811
crates/trogon-gateway/src/streams.rs                                            169      10  94.08%   11, 23, 31, 39, 47, 55, 63, 71, 79, 87
crates/trogon-gateway/src/source/github/config.rs                                17       0  100.00%
crates/trogon-gateway/src/source/github/server.rs                               328       0  100.00%
crates/trogon-gateway/src/source/github/signature.rs                             61       0  100.00%
crates/mcp-nats/src/nats/subjects/mod.rs                                         89       0  100.00%
crates/trogon-gateway/src/source/incidentio/incidentio_event_type.rs             62       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/incidentio/server.rs                           343       0  100.00%
crates/trogon-gateway/src/source/incidentio/incidentio_signing_secret.rs         67       0  100.00%
crates/acp-nats/src/telemetry/metrics.rs                                         53       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                  74       0  100.00%
crates/trogon-gateway/src/source/gitlab/server.rs                               460       0  100.00%
crates/trogon-gateway/src/source/notion/signature.rs                             56       1  98.21%   32
crates/trogon-gateway/src/source/notion/verification_token.rs                   240       0  100.00%
crates/trogon-gateway/src/source/notion/server.rs                               318       8  97.48%   93-97, 130-131, 150-151
crates/trogon-gateway/src/source/notion/notion_event_type.rs                     46       3  93.48%   47-49
crates/trogon-gateway/src/source/notion/notion_verification_token.rs             17       0  100.00%
crates/trogon-nats/src/telemetry/messaging.rs                                    82       0  100.00%
TOTAL                                                                         33876     623  98.16%

Diff against main

Filename                                   Stmts    Miss  Cover
---------------------------------------  -------  ------  --------
crates/trogon-decider/src/act.rs             +62       0  +100.00%
crates/trogon-decider/src/events.rs          +49       0  +100.00%
crates/trogon-decider/src/lib.rs            +144       0  +100.00%
crates/trogon-decider/src/decision.rs        +30       0  +100.00%
crates/acp-nats-server/src/transport.rs        0      -4  +0.22%
TOTAL                                       +285      -4  +0.03%

Results for commit: ff590a6

Minimum allowed coverage is 95%

♻️ This comment has been updated with latest results

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

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

Inline comments:
In `@rsworkspace/crates/trogon-decider/src/decision.rs`:
- Around line 20-31: DecisionFailure is missing Display and std::error::Error
impls; add implementations so callers can inspect error context and chain
sources. Implement fmt::Display for DecisionFailure<DecideError, EvolveError> to
print a concise message that delegates to the inner error's Display (e.g.
"decide failed: {}" or "evolve failed: {}"), and implement std::error::Error
with a source(&self) -> Option<&(dyn std::error::Error + 'static)> that returns
Some(&inner) for the matching variant and None otherwise; add appropriate trait
bounds on DecideError and EvolveError (e.g. they must implement
std::error::Error + fmt::Display + 'static) on these impls so the source
chaining works. Ensure you reference the DecisionFailure enum and DecisionResult
type (they already exist) when adding these impls.

In `@rsworkspace/crates/trogon-decider/src/lib.rs`:
- Around line 116-120: The DecideError and EvolveError associated types on the
trait must be constrained to implement std::error::Error to enforce proper error
types; update the trait declaration so DecideError and EvolveError include a
bound like "std::error::Error" (and any project-required Send/Sync/'static
bounds) on those associated types, and then update any test or impls that used
unit `()` to use a proper error type (e.g., a custom unit struct that implements
std::error::Error or a boxed/anyhow error) so implementations of the trait
(functions referencing DecideError and EvolveError) compile against the new
bounds.
🪄 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: de854636-9084-4729-b416-be331fdc7427

📥 Commits

Reviewing files that changed from the base of the PR and between 0f13a50 and 5a75684.

⛔ Files ignored due to path filters (1)
  • rsworkspace/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (6)
  • rsworkspace/crates/trogon-decider/Cargo.toml
  • rsworkspace/crates/trogon-decider/src/act.rs
  • rsworkspace/crates/trogon-decider/src/decision.rs
  • rsworkspace/crates/trogon-decider/src/events.rs
  • rsworkspace/crates/trogon-decider/src/lib.rs
  • rsworkspace/crates/trogon-decider/src/write_precondition.rs

Comment thread rsworkspace/crates/trogon-decider/src/decision.rs
Comment thread rsworkspace/crates/trogon-decider/src/lib.rs Outdated
@yordis yordis force-pushed the yordis/chore-create-pr-v1 branch from 5a75684 to d094082 Compare May 16, 2026 00:33
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
@yordis yordis force-pushed the yordis/chore-create-pr-v1 branch from d094082 to ff590a6 Compare May 16, 2026 00:50
@yordis yordis merged commit ff788c7 into main May 16, 2026
7 checks passed
@yordis yordis deleted the yordis/chore-create-pr-v1 branch May 16, 2026 01:15
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